Simple integer calculator using FRDM-KL25Z and Adafruit 2.8" TFT with touch \\ "Dentaku" means "Desktop Calculator" in Japanese \\ On 5-Dec-2015, Support for FRDM-K64F, FRDM-K22F, NUCLEO-F411RE added.

Dependencies:   SPI_STMPE610 UniGraphic mbed vt100

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers menu.cpp Source File

menu.cpp

00001 /** mbed oscilloscope my implementation of a oscillo scope
00002  * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
00003  *
00004  * menu.cpp
00005  *
00006  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00007  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00008  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00009  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00010  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00011  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00012  * THE SOFTWARE.
00013  */
00014 #include "mbed.h"
00015 #include <ILI9341.h>
00016 #include "SPI_STMPE610.h"
00017 //#include "Arial12x12.h"
00018 //#include "Arial24x23.h"
00019 #include "Arial28x28.h"
00020 //#include "Arial43x48_numb.h"
00021 #include "vt100.h"
00022 #include "TFTMenu.h"
00023 #include "menu.h"
00024 #include "main.h"
00025 
00026 #define NUM_MAX_DIGIT 8
00027 int num_digit = 0 ;
00028 long prevValue = 0 ;
00029 long topValue = 0 ;
00030 int op = opPlus ;
00031 
00032 void doDigit(int num)
00033 {
00034     if (num_digit < NUM_MAX_DIGIT) {
00035         topValue = topValue * 10 + num ;
00036         num_digit++ ;
00037         display() ;
00038     }
00039 }
00040 
00041 void do0(void) { doDigit(0) ; }
00042 void do1(void) { doDigit(1) ; }
00043 void do2(void) { doDigit(2) ; }
00044 void do3(void) { doDigit(3) ; }
00045 void do4(void) { doDigit(4) ; }
00046 void do5(void) { doDigit(5) ; }
00047 void do6(void) { doDigit(6) ; }
00048 void do7(void) { doDigit(7) ; }
00049 void do8(void) { doDigit(8) ; }
00050 void do9(void) { doDigit(9) ; }
00051 
00052 void doPlus(void) 
00053 {
00054     doCalc() ;
00055     prevValue = topValue ;
00056     topValue = 0 ;
00057     num_digit = 0 ;
00058     op = opPlus ;
00059     display("+") ;
00060 }
00061 
00062 void doMinus(void) 
00063 {
00064     doCalc() ;
00065     prevValue = topValue ;
00066     topValue = 0 ;
00067     num_digit = 0 ;
00068     op = opMinus ;
00069     display("-") ;
00070 }
00071 
00072 void doMul(void) 
00073 {
00074     doCalc() ;
00075     prevValue = topValue ;
00076     topValue = 0 ;
00077     num_digit = 0 ;
00078     op = opMul ;
00079     display("x") ;
00080 }
00081 
00082 void doDiv(void) 
00083 {
00084     doCalc() ;
00085     prevValue = topValue ;
00086     topValue = 0 ;
00087     num_digit = 0 ;
00088     op = opDiv ;
00089     display("/") ;
00090 }
00091 
00092 void doClear(void) 
00093 {
00094     prevValue = 0 ;
00095     topValue = 0 ;
00096     num_digit = 0 ;
00097     op = opPlus ;
00098     display() ;
00099 }
00100 
00101 int doCalc(void)
00102 {
00103     int error = 0 ;
00104     switch(op) {
00105     case opPlus:
00106         topValue += prevValue ;
00107         break ;
00108     case opMinus:
00109         topValue = prevValue - topValue ;
00110         break ;
00111     case opMul:
00112         topValue = prevValue * topValue ;
00113         break ;
00114     case opDiv:
00115         if (topValue != 0) {
00116             topValue = prevValue / topValue ;
00117         } else {
00118             error = 1 ;
00119         }
00120         break ;
00121     default:
00122         break ;
00123     }
00124     prevValue = 0 ;
00125     return(error) ;
00126 }
00127 
00128 void doEqu(void) 
00129 {
00130     int error = 0 ;
00131     error = doCalc() ;
00132     if (error) {
00133         display("Error!") ;
00134     } else {
00135         display() ;
00136     }
00137     op = opPlus ;
00138     num_digit = 0 ;
00139 }
00140 
00141 void initMenu(void)
00142 {
00143     int f_left = 18 ;
00144     int f_top = 14 ;
00145     
00146     numMenu = 0 ;
00147     menu[numMenu++] = new TFTMenuItem(  5, 85,  55, 135, do7,     "7", Green, Black, f_left, f_top) ;
00148     menu[numMenu++] = new TFTMenuItem( 65, 85, 115, 135, do8,     "8", Green, Black, f_left, f_top) ;
00149     menu[numMenu++] = new TFTMenuItem(125, 85, 175, 135, do9,     "9", Green, Black, f_left, f_top) ;
00150     menu[numMenu++] = new TFTMenuItem(185, 85, 235, 135, doClear, "C", Green, Black, f_left, f_top) ;
00151     
00152     menu[numMenu++] = new TFTMenuItem(  5, 145,  55, 195, do4,    "4", Green, Black, f_left, f_top) ;
00153     menu[numMenu++] = new TFTMenuItem( 65, 145, 115, 195, do5,    "5", Green, Black, f_left, f_top) ;
00154     menu[numMenu++] = new TFTMenuItem(125, 145, 175, 195, do6,    "6", Green, Black, f_left, f_top) ;
00155     menu[numMenu++] = new TFTMenuItem(185, 145, 235, 195, doMinus,"-", Green, Black, f_left, f_top) ;
00156     
00157     menu[numMenu++] = new TFTMenuItem(  5, 205,  55, 255, do1,    "1", Green, Black, f_left, f_top) ;
00158     menu[numMenu++] = new TFTMenuItem( 65, 205, 115, 255, do2,    "2", Green, Black, f_left, f_top) ;
00159     menu[numMenu++] = new TFTMenuItem(125, 205, 175, 255, do3,    "3", Green, Black, f_left, f_top) ;
00160     menu[numMenu++] = new TFTMenuItem(185, 205, 235, 255, doPlus, "+", Green, Black, f_left, f_top) ;
00161     
00162     menu[numMenu++] = new TFTMenuItem(  5, 265,  55, 315, do0,    "0", Green, Black, f_left, f_top) ;
00163     menu[numMenu++] = new TFTMenuItem( 65, 265, 115, 315, doMul  ,"x", Green, Black, f_left, f_top) ;
00164     menu[numMenu++] = new TFTMenuItem(125, 265, 175, 315, doDiv,  "/", Green, Black, f_left, f_top) ;
00165     menu[numMenu++] = new TFTMenuItem(185, 265, 235, 315, doEqu,  "=", Green, Black, f_left, f_top) ;
00166 }
00167 
00168 void drawMenu(void)
00169 {
00170     for (int i = 0 ; i < numMenu ; i++ ) {
00171         menu[i]->draw() ;
00172     }
00173 }
00174 
00175 bool doMenu(uint16_t x, uint16_t y)
00176 {
00177     bool result = false ;
00178 
00179     for (int i = 0 ; i < numMenu ; i++ ) {
00180         if (menu[i]->hit(x, y)) {
00181             menu[i]->doIt() ;
00182             menu[i]->draw() ;
00183             result = true ;
00184  //           printf("%s TopValue = %d, PreValue = %d\n\r", menu[i]->name(), topValue, prevValue) ;
00185             break ;
00186         }
00187     }
00188     return( result ) ;
00189 }