Basic calculator example to show the LPC4088 Experiment Base Board with a touch LCD from DisplayModule
Dependencies: DmTftLibrary mbed
Fork of dm_calc by
main.cpp@0:3713b01e72fe, 2014-05-20 (annotated)
- Committer:
- displaymodule
- Date:
- Tue May 20 15:36:25 2014 +0000
- Revision:
- 0:3713b01e72fe
- Child:
- 1:9a3ae682a75e
First version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
displaymodule | 0:3713b01e72fe | 1 | /********************************************************************************************** |
displaymodule | 0:3713b01e72fe | 2 | Copyright (c) 2014 DisplayModule. All rights reserved. |
displaymodule | 0:3713b01e72fe | 3 | |
displaymodule | 0:3713b01e72fe | 4 | Redistribution and use of this source code, part of this source code or any compiled binary |
displaymodule | 0:3713b01e72fe | 5 | based on this source code is permitted as long as the above copyright notice and following |
displaymodule | 0:3713b01e72fe | 6 | disclaimer is retained. |
displaymodule | 0:3713b01e72fe | 7 | |
displaymodule | 0:3713b01e72fe | 8 | DISCLAIMER: |
displaymodule | 0:3713b01e72fe | 9 | THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES |
displaymodule | 0:3713b01e72fe | 10 | NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE. |
displaymodule | 0:3713b01e72fe | 11 | ********************************************************************************************/ |
displaymodule | 0:3713b01e72fe | 12 | |
displaymodule | 0:3713b01e72fe | 13 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 14 | * Includes |
displaymodule | 0:3713b01e72fe | 15 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 16 | |
displaymodule | 0:3713b01e72fe | 17 | #include "mbed.h" |
displaymodule | 0:3713b01e72fe | 18 | |
displaymodule | 0:3713b01e72fe | 19 | #include "DmTftHX8353C.h" |
displaymodule | 0:3713b01e72fe | 20 | #include "DmTftS6D0164.h" |
displaymodule | 0:3713b01e72fe | 21 | #include "DmTftIli9325.h" |
displaymodule | 0:3713b01e72fe | 22 | #include "DmTftIli9341.h" |
displaymodule | 0:3713b01e72fe | 23 | #include "DmTftSsd2119.h" |
displaymodule | 0:3713b01e72fe | 24 | #include "DmTouch.h" |
displaymodule | 0:3713b01e72fe | 25 | |
displaymodule | 0:3713b01e72fe | 26 | #include "Button.h" |
displaymodule | 0:3713b01e72fe | 27 | |
displaymodule | 0:3713b01e72fe | 28 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 29 | * Typedefs and defines |
displaymodule | 0:3713b01e72fe | 30 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 31 | |
displaymodule | 0:3713b01e72fe | 32 | typedef enum { |
displaymodule | 0:3713b01e72fe | 33 | MODE_WANT_ARG1, |
displaymodule | 0:3713b01e72fe | 34 | MODE_WANT_ARG1_OR_OP, |
displaymodule | 0:3713b01e72fe | 35 | MODE_WANT_ARG2, |
displaymodule | 0:3713b01e72fe | 36 | MODE_WANT_ARG2_OR_OP, |
displaymodule | 0:3713b01e72fe | 37 | } calc_mode_t; |
displaymodule | 0:3713b01e72fe | 38 | |
displaymodule | 0:3713b01e72fe | 39 | #define MARGIN 5 |
displaymodule | 0:3713b01e72fe | 40 | |
displaymodule | 0:3713b01e72fe | 41 | #define RESULT_MARGIN_X (MARGIN*3) |
displaymodule | 0:3713b01e72fe | 42 | #define RESULT_MARGIN_Y (MARGIN*3) |
displaymodule | 0:3713b01e72fe | 43 | |
displaymodule | 0:3713b01e72fe | 44 | #define NUM_BUTTONS (sizeof(captions)/sizeof(captions[0])) |
displaymodule | 0:3713b01e72fe | 45 | |
displaymodule | 0:3713b01e72fe | 46 | #if 0 /* Displays without adapter */ |
displaymodule | 0:3713b01e72fe | 47 | #define DM_PIN_SPI_MOSI D11 |
displaymodule | 0:3713b01e72fe | 48 | #define DM_PIN_SPI_MISO D12 |
displaymodule | 0:3713b01e72fe | 49 | #define DM_PIN_SPI_SCLK D13 |
displaymodule | 0:3713b01e72fe | 50 | |
displaymodule | 0:3713b01e72fe | 51 | #define DM_PIN_CS_TOUCH D4 |
displaymodule | 0:3713b01e72fe | 52 | #define DM_PIN_CS_TFT D10 |
displaymodule | 0:3713b01e72fe | 53 | #define DM_PIN_CS_SDCARD D8 |
displaymodule | 0:3713b01e72fe | 54 | #define DM_PIN_CS_FLASH D6 |
displaymodule | 0:3713b01e72fe | 55 | #else /* Displays with adapter */ |
displaymodule | 0:3713b01e72fe | 56 | #define DM_PIN_SPI_MOSI A0 |
displaymodule | 0:3713b01e72fe | 57 | #define DM_PIN_SPI_MISO D9 |
displaymodule | 0:3713b01e72fe | 58 | #define DM_PIN_SPI_SCLK A1 |
displaymodule | 0:3713b01e72fe | 59 | |
displaymodule | 0:3713b01e72fe | 60 | #define DM_PIN_CS_TOUCH D8 |
displaymodule | 0:3713b01e72fe | 61 | #define DM_PIN_CS_TFT A3 |
displaymodule | 0:3713b01e72fe | 62 | #define DM_PIN_CS_SDCARD D10 |
displaymodule | 0:3713b01e72fe | 63 | #endif |
displaymodule | 0:3713b01e72fe | 64 | |
displaymodule | 0:3713b01e72fe | 65 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 66 | * Local variables |
displaymodule | 0:3713b01e72fe | 67 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 68 | |
displaymodule | 0:3713b01e72fe | 69 | //DmTftHX8353C tft; /* DM_TFT18_101 */ |
displaymodule | 0:3713b01e72fe | 70 | //DmTftS6D0164 tft; /* DM_TFT22_102 */ |
displaymodule | 0:3713b01e72fe | 71 | DmTftIli9325 tft; /* DM_TFT28_103 and DM_TFT24_104 */ |
displaymodule | 0:3713b01e72fe | 72 | //DmTftIli9341 tft; /* DM_TFT28_105 */ |
displaymodule | 0:3713b01e72fe | 73 | //DmTftSsd2119 tft; /* DM_TFT35_107 */ |
displaymodule | 0:3713b01e72fe | 74 | |
displaymodule | 0:3713b01e72fe | 75 | //DmTouch touch(DmTouch::DM_TFT28_103, false); /* For LPC4088 QuickStart Board */ |
displaymodule | 0:3713b01e72fe | 76 | //DmTouch touch(DmTouch::DM_TFT28_103); |
displaymodule | 0:3713b01e72fe | 77 | //DmTouch touch(DmTouch::DM_TFT24_104, false); /* For LPC4088 QuickStart Board */ |
displaymodule | 0:3713b01e72fe | 78 | DmTouch touch(DmTouch::DM_TFT24_104); |
displaymodule | 0:3713b01e72fe | 79 | //DmTouch touch(DmTouch::DM_TFT28_105); |
displaymodule | 0:3713b01e72fe | 80 | //DmTouch touch(DmTouch::DM_TFT35_107); |
displaymodule | 0:3713b01e72fe | 81 | |
displaymodule | 0:3713b01e72fe | 82 | DigitalInOut csTouch(DM_PIN_CS_TOUCH, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 83 | DigitalInOut csDisplay(DM_PIN_CS_TFT, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 84 | DigitalInOut csSDCard(DM_PIN_CS_SDCARD, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 85 | #ifdef DM_PIN_CS_FLASH |
displaymodule | 0:3713b01e72fe | 86 | DigitalInOut csFlash(DM_PIN_CS_FLASH, PIN_OUTPUT, PullUp, 1); |
displaymodule | 0:3713b01e72fe | 87 | #endif |
displaymodule | 0:3713b01e72fe | 88 | |
displaymodule | 0:3713b01e72fe | 89 | /* |
displaymodule | 0:3713b01e72fe | 90 | * 7 8 9 + |
displaymodule | 0:3713b01e72fe | 91 | * 4 5 6 - |
displaymodule | 0:3713b01e72fe | 92 | * 3 2 1 * |
displaymodule | 0:3713b01e72fe | 93 | * 0 = clr / |
displaymodule | 0:3713b01e72fe | 94 | */ |
displaymodule | 0:3713b01e72fe | 95 | const char* captions[] = { |
displaymodule | 0:3713b01e72fe | 96 | "7","8","9","+", |
displaymodule | 0:3713b01e72fe | 97 | "4","5","6","-", |
displaymodule | 0:3713b01e72fe | 98 | "3","2","1","*", |
displaymodule | 0:3713b01e72fe | 99 | "0","=","clr","/", |
displaymodule | 0:3713b01e72fe | 100 | }; |
displaymodule | 0:3713b01e72fe | 101 | Button* buttons[NUM_BUTTONS]; |
displaymodule | 0:3713b01e72fe | 102 | |
displaymodule | 0:3713b01e72fe | 103 | static char buff[25] = {0}; |
displaymodule | 0:3713b01e72fe | 104 | static bool redrawResult = true; |
displaymodule | 0:3713b01e72fe | 105 | static bool clearResult = true; |
displaymodule | 0:3713b01e72fe | 106 | |
displaymodule | 0:3713b01e72fe | 107 | #ifdef DEBUG |
displaymodule | 0:3713b01e72fe | 108 | static char debug[25] = {0}; |
displaymodule | 0:3713b01e72fe | 109 | static char debug2[25] = {0}; |
displaymodule | 0:3713b01e72fe | 110 | static int debug_pos = 0; |
displaymodule | 0:3713b01e72fe | 111 | #endif |
displaymodule | 0:3713b01e72fe | 112 | |
displaymodule | 0:3713b01e72fe | 113 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 114 | * Global variables |
displaymodule | 0:3713b01e72fe | 115 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 116 | |
displaymodule | 0:3713b01e72fe | 117 | |
displaymodule | 0:3713b01e72fe | 118 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 119 | * Local functions |
displaymodule | 0:3713b01e72fe | 120 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 121 | |
displaymodule | 0:3713b01e72fe | 122 | void handleClick(uint32_t arg) |
displaymodule | 0:3713b01e72fe | 123 | { |
displaymodule | 0:3713b01e72fe | 124 | static int val1 = 0; |
displaymodule | 0:3713b01e72fe | 125 | static int val2 = 0; |
displaymodule | 0:3713b01e72fe | 126 | static int op = 0; |
displaymodule | 0:3713b01e72fe | 127 | static calc_mode_t mode = MODE_WANT_ARG1; |
displaymodule | 0:3713b01e72fe | 128 | static int strpos = 0; |
displaymodule | 0:3713b01e72fe | 129 | |
displaymodule | 0:3713b01e72fe | 130 | #ifdef DEBUG |
displaymodule | 0:3713b01e72fe | 131 | debug2[debug_pos] = '0'+mode; |
displaymodule | 0:3713b01e72fe | 132 | debug[debug_pos] = arg; |
displaymodule | 0:3713b01e72fe | 133 | debug_pos++; |
displaymodule | 0:3713b01e72fe | 134 | debug[debug_pos] = '\0'; |
displaymodule | 0:3713b01e72fe | 135 | debug_pos = debug_pos%25; |
displaymodule | 0:3713b01e72fe | 136 | #endif |
displaymodule | 0:3713b01e72fe | 137 | switch (arg) |
displaymodule | 0:3713b01e72fe | 138 | { |
displaymodule | 0:3713b01e72fe | 139 | case '0': |
displaymodule | 0:3713b01e72fe | 140 | case '1': |
displaymodule | 0:3713b01e72fe | 141 | case '2': |
displaymodule | 0:3713b01e72fe | 142 | case '3': |
displaymodule | 0:3713b01e72fe | 143 | case '4': |
displaymodule | 0:3713b01e72fe | 144 | case '5': |
displaymodule | 0:3713b01e72fe | 145 | case '6': |
displaymodule | 0:3713b01e72fe | 146 | case '7': |
displaymodule | 0:3713b01e72fe | 147 | case '8': |
displaymodule | 0:3713b01e72fe | 148 | case '9': |
displaymodule | 0:3713b01e72fe | 149 | if ((mode == MODE_WANT_ARG1) || (mode == MODE_WANT_ARG1_OR_OP)) { |
displaymodule | 0:3713b01e72fe | 150 | val1 = val1*10 + (arg - '0'); |
displaymodule | 0:3713b01e72fe | 151 | mode = MODE_WANT_ARG1_OR_OP; |
displaymodule | 0:3713b01e72fe | 152 | buff[strpos++] = arg; |
displaymodule | 0:3713b01e72fe | 153 | } else if ((mode == MODE_WANT_ARG2) || (mode == MODE_WANT_ARG2_OR_OP)) { |
displaymodule | 0:3713b01e72fe | 154 | val2 = val2*10 + (arg - '0'); |
displaymodule | 0:3713b01e72fe | 155 | mode = MODE_WANT_ARG2_OR_OP; |
displaymodule | 0:3713b01e72fe | 156 | buff[strpos++] = arg; |
displaymodule | 0:3713b01e72fe | 157 | } |
displaymodule | 0:3713b01e72fe | 158 | break; |
displaymodule | 0:3713b01e72fe | 159 | case '+': |
displaymodule | 0:3713b01e72fe | 160 | case '-': |
displaymodule | 0:3713b01e72fe | 161 | case '*': |
displaymodule | 0:3713b01e72fe | 162 | case '/': |
displaymodule | 0:3713b01e72fe | 163 | if (mode == MODE_WANT_ARG1_OR_OP) { |
displaymodule | 0:3713b01e72fe | 164 | op = arg; |
displaymodule | 0:3713b01e72fe | 165 | mode = MODE_WANT_ARG2; |
displaymodule | 0:3713b01e72fe | 166 | buff[strpos++] = arg; |
displaymodule | 0:3713b01e72fe | 167 | } else if (mode == MODE_WANT_ARG2_OR_OP) { |
displaymodule | 0:3713b01e72fe | 168 | // already have "a op b", calculate it and go to "c op" |
displaymodule | 0:3713b01e72fe | 169 | switch (op) { |
displaymodule | 0:3713b01e72fe | 170 | case '+': val1 = val1 + val2; break; |
displaymodule | 0:3713b01e72fe | 171 | case '-': val1 = val1 - val2; break; |
displaymodule | 0:3713b01e72fe | 172 | case '*': val1 = val1 * val2; break; |
displaymodule | 0:3713b01e72fe | 173 | case '/': val1 = val1 / val2; break; |
displaymodule | 0:3713b01e72fe | 174 | } |
displaymodule | 0:3713b01e72fe | 175 | op = arg; |
displaymodule | 0:3713b01e72fe | 176 | val2 = 0; |
displaymodule | 0:3713b01e72fe | 177 | mode = MODE_WANT_ARG2; |
displaymodule | 0:3713b01e72fe | 178 | strpos = sprintf(buff, "%d%c", val1, op); |
displaymodule | 0:3713b01e72fe | 179 | clearResult = true; |
displaymodule | 0:3713b01e72fe | 180 | } |
displaymodule | 0:3713b01e72fe | 181 | break; |
displaymodule | 0:3713b01e72fe | 182 | case 'c': |
displaymodule | 0:3713b01e72fe | 183 | val1 = val2 = op = 0; |
displaymodule | 0:3713b01e72fe | 184 | mode = MODE_WANT_ARG1; |
displaymodule | 0:3713b01e72fe | 185 | strpos = 0; |
displaymodule | 0:3713b01e72fe | 186 | clearResult = true; |
displaymodule | 0:3713b01e72fe | 187 | break; |
displaymodule | 0:3713b01e72fe | 188 | case '=': |
displaymodule | 0:3713b01e72fe | 189 | default: |
displaymodule | 0:3713b01e72fe | 190 | if (mode == MODE_WANT_ARG2_OR_OP) { |
displaymodule | 0:3713b01e72fe | 191 | // already have "a op b", calculate it and go to "c" |
displaymodule | 0:3713b01e72fe | 192 | switch (op) { |
displaymodule | 0:3713b01e72fe | 193 | case '+': val1 = val1 + val2; break; |
displaymodule | 0:3713b01e72fe | 194 | case '-': val1 = val1 - val2; break; |
displaymodule | 0:3713b01e72fe | 195 | case '*': val1 = val1 * val2; break; |
displaymodule | 0:3713b01e72fe | 196 | case '/': val1 = val1 / val2; break; |
displaymodule | 0:3713b01e72fe | 197 | } |
displaymodule | 0:3713b01e72fe | 198 | mode = MODE_WANT_ARG1_OR_OP; |
displaymodule | 0:3713b01e72fe | 199 | val2 = 0; |
displaymodule | 0:3713b01e72fe | 200 | strpos = sprintf(buff, "%d", val1); |
displaymodule | 0:3713b01e72fe | 201 | clearResult = true; |
displaymodule | 0:3713b01e72fe | 202 | } |
displaymodule | 0:3713b01e72fe | 203 | break; |
displaymodule | 0:3713b01e72fe | 204 | } |
displaymodule | 0:3713b01e72fe | 205 | buff[strpos] = '\0'; |
displaymodule | 0:3713b01e72fe | 206 | redrawResult = true; |
displaymodule | 0:3713b01e72fe | 207 | } |
displaymodule | 0:3713b01e72fe | 208 | |
displaymodule | 0:3713b01e72fe | 209 | /****************************************************************************** |
displaymodule | 0:3713b01e72fe | 210 | * Main |
displaymodule | 0:3713b01e72fe | 211 | *****************************************************************************/ |
displaymodule | 0:3713b01e72fe | 212 | |
displaymodule | 0:3713b01e72fe | 213 | int main() { |
displaymodule | 0:3713b01e72fe | 214 | uint16_t x = 0; |
displaymodule | 0:3713b01e72fe | 215 | uint16_t y = 0; |
displaymodule | 0:3713b01e72fe | 216 | uint16_t w = tft.width(); |
displaymodule | 0:3713b01e72fe | 217 | uint16_t h = tft.height(); |
displaymodule | 0:3713b01e72fe | 218 | uint16_t size = (w - 5*MARGIN)/4; |
displaymodule | 0:3713b01e72fe | 219 | uint16_t yoff = h - (size + MARGIN)*4; |
displaymodule | 0:3713b01e72fe | 220 | bool down = false; |
displaymodule | 0:3713b01e72fe | 221 | |
displaymodule | 0:3713b01e72fe | 222 | for (int i = 0; i < NUM_BUTTONS;i++) { |
displaymodule | 0:3713b01e72fe | 223 | x = MARGIN + (size + MARGIN) * (i % 4); |
displaymodule | 0:3713b01e72fe | 224 | y = yoff + (size + MARGIN) * (i / 4); |
displaymodule | 0:3713b01e72fe | 225 | buttons[i] = new Button(captions[i], x, y, size, size); |
displaymodule | 0:3713b01e72fe | 226 | buttons[i]->setAction(handleClick, captions[i][0]); |
displaymodule | 0:3713b01e72fe | 227 | } |
displaymodule | 0:3713b01e72fe | 228 | |
displaymodule | 0:3713b01e72fe | 229 | tft.init(); |
displaymodule | 0:3713b01e72fe | 230 | tft.clearScreen(BRIGHT_RED); |
displaymodule | 0:3713b01e72fe | 231 | tft.fillRectangle(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, BLACK); |
displaymodule | 0:3713b01e72fe | 232 | touch.init(); |
displaymodule | 0:3713b01e72fe | 233 | |
displaymodule | 0:3713b01e72fe | 234 | for (int i = 0; i < NUM_BUTTONS; i++) { |
displaymodule | 0:3713b01e72fe | 235 | buttons[i]->draw(&tft); |
displaymodule | 0:3713b01e72fe | 236 | } |
displaymodule | 0:3713b01e72fe | 237 | |
displaymodule | 0:3713b01e72fe | 238 | while(true) { |
displaymodule | 0:3713b01e72fe | 239 | touch.readTouchData(x, y, down); |
displaymodule | 0:3713b01e72fe | 240 | |
displaymodule | 0:3713b01e72fe | 241 | for (int i = 0; i < NUM_BUTTONS; i++) { |
displaymodule | 0:3713b01e72fe | 242 | if (buttons[i]->handle(x, y, down)) { |
displaymodule | 0:3713b01e72fe | 243 | buttons[i]->draw(&tft); |
displaymodule | 0:3713b01e72fe | 244 | } |
displaymodule | 0:3713b01e72fe | 245 | } |
displaymodule | 0:3713b01e72fe | 246 | if (clearResult) { |
displaymodule | 0:3713b01e72fe | 247 | clearResult = false; |
displaymodule | 0:3713b01e72fe | 248 | tft.fillRectangle(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, BLACK); |
displaymodule | 0:3713b01e72fe | 249 | } |
displaymodule | 0:3713b01e72fe | 250 | if (redrawResult) { |
displaymodule | 0:3713b01e72fe | 251 | redrawResult = false; |
displaymodule | 0:3713b01e72fe | 252 | tft.drawStringCentered(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, &buff[0]); |
displaymodule | 0:3713b01e72fe | 253 | #ifdef DEBUG |
displaymodule | 0:3713b01e72fe | 254 | tft.drawString(5, 5, &debug[0]); |
displaymodule | 0:3713b01e72fe | 255 | tft.drawString(5, 25, &debug2[0]); |
displaymodule | 0:3713b01e72fe | 256 | tft.drawNumber(5, 45, val1, 6); |
displaymodule | 0:3713b01e72fe | 257 | tft.drawNumber(5, 65, val2, 6); |
displaymodule | 0:3713b01e72fe | 258 | tft.drawString(5, 25, &debug2[0]); |
displaymodule | 0:3713b01e72fe | 259 | #endif |
displaymodule | 0:3713b01e72fe | 260 | } |
displaymodule | 0:3713b01e72fe | 261 | wait(0.02); |
displaymodule | 0:3713b01e72fe | 262 | } |
displaymodule | 0:3713b01e72fe | 263 | } |