diff --git a/calculator/calculator.app.js b/calculator/calculator.app.js index 2897095..ebb251a 100644 --- a/calculator/calculator.app.js +++ b/calculator/calculator.app.js @@ -75,6 +75,7 @@ var specials = { 'R': {grid: [0, 0], globalGrid: [0, 0], trbl: 'RN7R', val: 'AC'}, 'N': {grid: [1, 0], globalGrid: [1, 0], trbl: 'N%8R', val: '+/-'}, '%': {grid: [0, 1], globalGrid: [2, 0], trbl: '%/9N'}, + 'send': {grid: [1, 1], val: 'send'}, }; var selected = DEFAULT_SELECTION_NUMBERS; @@ -86,6 +87,8 @@ var results = null; var isDecimal = false; var hasPressedEquals = false; var angleMode = 'deg'; +var prevExpression = null; +var currExpression = ""; function prepareScreen(screen, grid, defaultColor) { for (var k in screen) { @@ -328,16 +331,21 @@ function calculatorLogic(x) { displayOutput(prevNumber); } else if (prevNumber != null && currNumber != null && operator != null) { // we execute the calculus only when there was a previous number entered before and an operator + let oldOperator = operator; results = doMath(prevNumber, currNumber, operator); operator = x; prevNumber = results; + prevExpression = "(" + prevExpression + " " + oldOperator + " " + currExpression + ")"; currNumber = null; + currExpression = ""; displayOutput(results); } else if (prevNumber == null && currNumber != null && operator == null) { // no operator yet, save the current number for later use when an operator is pressed operator = x; prevNumber = currNumber; + prevExpression = currExpression; currNumber = null; + currExpression = ""; displayOutput(prevNumber); } else if (prevNumber == null && currNumber == null && operator == null) { displayOutput(0); @@ -354,6 +362,8 @@ function buttonPress(val) { if (specials.R.val == 'AC') { prevNumber = null; operator = null; + prevExpression = null; + currExpression = ""; } else { specials.R.val = 'AC'; drawKey('R', specials.R, true); @@ -365,8 +375,10 @@ function buttonPress(val) { case '%': if (results != null) { displayOutput(results /= 100); + prevExpression = "(" + prevExpression + ")/100"; } else if (currNumber != null) { displayOutput(currNumber /= 100); + currExpression = "(" + currExpression + ")/100"; } hasPressedNumber = false; break; @@ -374,9 +386,11 @@ function buttonPress(val) { if (results != null) { results = Math.sqrt(results); displayOutput(results); + prevExpression = "sqrt(" + prevExpression + ")"; } else if (currNumber != null) { currNumber = Math.sqrt(currNumber); displayOutput(currNumber); + currExpression = "sqrt(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -384,10 +398,12 @@ function buttonPress(val) { if (results != null) { results = results * results; displayOutput(results); + prevExpression = "(" + prevExpression + ")^2"; } else if (currNumber != null) { var num = parseFloat(currNumber); currNumber = num * num; displayOutput(currNumber); + currExpression = "(" + currExpression + ")^2"; } hasPressedNumber = false; break; @@ -399,6 +415,7 @@ function buttonPress(val) { } results = fixFloat(Math.sin(angle)); displayOutput(results); + prevExpression = "sin(" + prevExpression + ")"; } else if (currNumber != null) { let angle = currNumber; if (angleMode === 'deg') { @@ -406,6 +423,7 @@ function buttonPress(val) { } currNumber = fixFloat(Math.sin(angle)); displayOutput(currNumber); + currExpression = "sin(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -417,6 +435,7 @@ function buttonPress(val) { } results = fixFloat(Math.cos(angle)); displayOutput(results); + prevExpression = "cos(" + prevExpression + ")"; } else if (currNumber != null) { let angle = currNumber; if (angleMode === 'deg') { @@ -424,6 +443,7 @@ function buttonPress(val) { } currNumber = fixFloat(Math.cos(angle)); displayOutput(currNumber); + currExpression = "cos(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -435,6 +455,7 @@ function buttonPress(val) { } results = fixFloat(Math.tan(angle)); displayOutput(results); + prevExpression = "tan(" + prevExpression + ")"; } else if (currNumber != null) { let angle = currNumber; if (angleMode === 'deg') { @@ -442,6 +463,7 @@ function buttonPress(val) { } currNumber = fixFloat(Math.tan(angle)); displayOutput(currNumber); + currExpression = "tan(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -449,9 +471,11 @@ function buttonPress(val) { if (results != null) { results = Math.log(results) / Math.LN10; displayOutput(results); + prevExpression = "log(" + prevExpression + ")"; } else if (currNumber != null) { currNumber = Math.log(currNumber) / Math.LN10; displayOutput(currNumber); + currExpression = "log(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -459,9 +483,11 @@ function buttonPress(val) { if (results != null) { results = Math.pow(10, results); displayOutput(results); + prevExpression = "10^(" + prevExpression + ")"; } else if (currNumber != null) { currNumber = Math.pow(10, currNumber); displayOutput(currNumber); + currExpression = "10^(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -469,9 +495,11 @@ function buttonPress(val) { if (results != null) { results = Math.log(results); displayOutput(results); + prevExpression = "ln(" + prevExpression + ")"; } else if (currNumber != null) { currNumber = Math.log(currNumber); displayOutput(currNumber); + currExpression = "ln(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -479,9 +507,11 @@ function buttonPress(val) { if (results != null) { results = Math.exp(results); displayOutput(results); + prevExpression = "e^(" + prevExpression + ")"; } else if (currNumber != null) { currNumber = Math.exp(currNumber); displayOutput(currNumber); + currExpression = "e^(" + currExpression + ")"; } hasPressedNumber = false; break; @@ -498,17 +528,21 @@ function buttonPress(val) { if (results != null) { results = 1 / results; displayOutput(results); + prevExpression = "1/(" + prevExpression + ")"; } else if (currNumber != null) { currNumber = 1 / parseFloat(currNumber); displayOutput(currNumber); + currExpression = "1/(" + currExpression + ")"; } hasPressedNumber = false; break; case 'N': if (results != null) { displayOutput(results *= -1); + prevExpression = "-(" + prevExpression + ")"; } else { displayOutput(currNumber *= -1); + currExpression = "-(" + currExpression + ")"; } break; case 'B': @@ -529,6 +563,7 @@ function buttonPress(val) { isDecimal = false; } hasPressedNumber = currNumber; + currExpression = currNumber; displayOutput(currNumber); } break; @@ -548,13 +583,37 @@ function buttonPress(val) { break; case '=': if (prevNumber != null && currNumber != null && operator != null) { + prevExpression = "(" + prevExpression + " " + operator + " " + currExpression + ")"; results = doMath(prevNumber, currNumber, operator); prevNumber = results; + currExpression = ""; displayOutput(results); hasPressedEquals = 1; } hasPressedNumber = false; break; + case 'send': + let logStr; + if (hasPressedEquals) { + logStr = prevExpression + " = " + results; + } else if (operator && prevExpression) { // Incomplete binary operation, e.g. "5 +" or "5 + 3" + logStr = prevExpression + " " + operator; + if (currExpression) { + logStr += " " + currExpression; + } + } else if (results) { // Result of a unary op on a previous result + logStr = prevExpression + " = " + results; + } else if (currNumber) { // A number has been entered, or a unary op on it + if (currExpression && currExpression !== currNumber.toString()) { + logStr = currExpression + " = " + currNumber; + } else { + logStr = currNumber.toString(); + } + } else { + logStr = results ? results.toString() : "0"; + } + console.log(logStr); + break; default: { specials.R.val = 'C'; if (!swipeEnabled) drawKey('R', specials.R); @@ -569,6 +628,7 @@ function buttonPress(val) { hasPressedEquals = 2; } hasPressedNumber = currNumber; + currExpression = currNumber; displayOutput(currNumber); break; }