Basic calculator example to show the LPC4088 Experiment Base Board with a touch LCD from DisplayModule

Dependencies:   DmTftLibrary mbed

Fork of dm_calc by Display Module

Committer:
embeddedartists
Date:
Wed Sep 10 12:48:14 2014 +0000
Revision:
4:71588a1e3618
Parent:
2:b17b19212e5a
Child:
5:d2802a0c5af2
Updated documentation

Who changed what in which revision?

UserRevisionLine numberNew 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
embeddedartists 4:71588a1e3618 46 #if 0
embeddedartists 4:71588a1e3618 47 /* Displays without adapter (DM_TFT28_105 & DM_TFT35_107) */
displaymodule 1:9a3ae682a75e 48 #define DM_PIN_CS_TOUCH D4
displaymodule 1:9a3ae682a75e 49 #define DM_PIN_CS_TFT D10
displaymodule 1:9a3ae682a75e 50 #define DM_PIN_CS_SDCARD D8
displaymodule 1:9a3ae682a75e 51 #define DM_PIN_CS_FLASH D6
displaymodule 1:9a3ae682a75e 52 #else
embeddedartists 4:71588a1e3618 53 /* Displays with adapter (all other displays) */
embeddedartists 4:71588a1e3618 54 #define DM_PIN_CS_TFT D4
displaymodule 1:9a3ae682a75e 55 #define DM_PIN_CS_SDCARD D10
displaymodule 1:9a3ae682a75e 56 #endif
displaymodule 0:3713b01e72fe 57
displaymodule 1:9a3ae682a75e 58 //#define LANDSCAPE
displaymodule 0:3713b01e72fe 59
displaymodule 0:3713b01e72fe 60 /******************************************************************************
displaymodule 0:3713b01e72fe 61 * Local variables
displaymodule 0:3713b01e72fe 62 *****************************************************************************/
displaymodule 0:3713b01e72fe 63
embeddedartists 4:71588a1e3618 64 DmTftIli9325 tft; /* DM_TFT28_103 and DM_TFT24_104 with adapter in arduino J1 contact */
embeddedartists 4:71588a1e3618 65 //DmTftIli9341 tft; /* DM_TFT28_105 directly in arduino J1 contact (no adapter) */
embeddedartists 4:71588a1e3618 66 //DmTftSsd2119 tft; /* DM_TFT35_107 directly in arduino J1 contact (no adapter) */
displaymodule 0:3713b01e72fe 67
embeddedartists 4:71588a1e3618 68 //DmTouch touch(DmTouch::DM_TFT28_103, DmTouch::Software);
embeddedartists 4:71588a1e3618 69 DmTouch touch(DmTouch::DM_TFT24_104, DmTouch::Software);
embeddedartists 4:71588a1e3618 70 //DmTouch touch(DmTouch::DM_TFT28_105);
displaymodule 0:3713b01e72fe 71 //DmTouch touch(DmTouch::DM_TFT35_107);
displaymodule 0:3713b01e72fe 72
embeddedartists 4:71588a1e3618 73 #ifdef DM_PIN_CS_TOUCH
embeddedartists 4:71588a1e3618 74 DigitalInOut csTouch(DM_PIN_CS_TOUCH, PIN_OUTPUT, PullUp, 1);
embeddedartists 4:71588a1e3618 75 #endif
displaymodule 0:3713b01e72fe 76 DigitalInOut csDisplay(DM_PIN_CS_TFT, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3713b01e72fe 77 DigitalInOut csSDCard(DM_PIN_CS_SDCARD, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3713b01e72fe 78 #ifdef DM_PIN_CS_FLASH
displaymodule 0:3713b01e72fe 79 DigitalInOut csFlash(DM_PIN_CS_FLASH, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3713b01e72fe 80 #endif
displaymodule 0:3713b01e72fe 81
displaymodule 1:9a3ae682a75e 82 #ifdef LANDSCAPE
displaymodule 1:9a3ae682a75e 83 #define BUTTONS_PER_LINE 6
displaymodule 1:9a3ae682a75e 84 #define BUTTONS_NUM_LINES 3
displaymodule 1:9a3ae682a75e 85 /*
displaymodule 1:9a3ae682a75e 86 * 1 2 3 4 5 +
displaymodule 1:9a3ae682a75e 87 * 6 7 8 9 0 -
displaymodule 1:9a3ae682a75e 88 * * / = clr
displaymodule 1:9a3ae682a75e 89 */
displaymodule 1:9a3ae682a75e 90 const char* captions[] = {
displaymodule 1:9a3ae682a75e 91 "1","2","3","4","5","+",
displaymodule 1:9a3ae682a75e 92 "6","7","8","9","0","-",
displaymodule 1:9a3ae682a75e 93 "*","/","=","clr",
displaymodule 1:9a3ae682a75e 94 };
displaymodule 1:9a3ae682a75e 95 #else
displaymodule 1:9a3ae682a75e 96 #define BUTTONS_PER_LINE 4
displaymodule 1:9a3ae682a75e 97 #define BUTTONS_NUM_LINES 4
displaymodule 1:9a3ae682a75e 98 /*
displaymodule 1:9a3ae682a75e 99 * 1 2 3 +
displaymodule 1:9a3ae682a75e 100 * 4 5 6 -
displaymodule 1:9a3ae682a75e 101 * 7 8 9 *
displaymodule 1:9a3ae682a75e 102 * 0 = clr /
displaymodule 1:9a3ae682a75e 103 */
displaymodule 1:9a3ae682a75e 104 const char* captions[] = {
displaymodule 1:9a3ae682a75e 105 "1","2","3","+",
displaymodule 1:9a3ae682a75e 106 "4","5","6","-",
displaymodule 1:9a3ae682a75e 107 "7","8","9","*",
displaymodule 1:9a3ae682a75e 108 "0","=","clr","/",
displaymodule 1:9a3ae682a75e 109 };
displaymodule 1:9a3ae682a75e 110 #endif
displaymodule 1:9a3ae682a75e 111
displaymodule 0:3713b01e72fe 112 Button* buttons[NUM_BUTTONS];
displaymodule 0:3713b01e72fe 113
displaymodule 0:3713b01e72fe 114 static char buff[25] = {0};
displaymodule 0:3713b01e72fe 115 static bool redrawResult = true;
displaymodule 0:3713b01e72fe 116 static bool clearResult = true;
displaymodule 0:3713b01e72fe 117
displaymodule 0:3713b01e72fe 118 /******************************************************************************
displaymodule 0:3713b01e72fe 119 * Global variables
displaymodule 0:3713b01e72fe 120 *****************************************************************************/
displaymodule 0:3713b01e72fe 121
displaymodule 0:3713b01e72fe 122
displaymodule 0:3713b01e72fe 123 /******************************************************************************
displaymodule 0:3713b01e72fe 124 * Local functions
displaymodule 0:3713b01e72fe 125 *****************************************************************************/
displaymodule 0:3713b01e72fe 126
displaymodule 0:3713b01e72fe 127 void handleClick(uint32_t arg)
displaymodule 0:3713b01e72fe 128 {
displaymodule 0:3713b01e72fe 129 static int val1 = 0;
displaymodule 0:3713b01e72fe 130 static int val2 = 0;
displaymodule 0:3713b01e72fe 131 static int op = 0;
displaymodule 0:3713b01e72fe 132 static calc_mode_t mode = MODE_WANT_ARG1;
displaymodule 0:3713b01e72fe 133 static int strpos = 0;
displaymodule 0:3713b01e72fe 134
displaymodule 0:3713b01e72fe 135 switch (arg)
displaymodule 0:3713b01e72fe 136 {
displaymodule 0:3713b01e72fe 137 case '0':
displaymodule 0:3713b01e72fe 138 case '1':
displaymodule 0:3713b01e72fe 139 case '2':
displaymodule 0:3713b01e72fe 140 case '3':
displaymodule 0:3713b01e72fe 141 case '4':
displaymodule 0:3713b01e72fe 142 case '5':
displaymodule 0:3713b01e72fe 143 case '6':
displaymodule 0:3713b01e72fe 144 case '7':
displaymodule 0:3713b01e72fe 145 case '8':
displaymodule 0:3713b01e72fe 146 case '9':
displaymodule 0:3713b01e72fe 147 if ((mode == MODE_WANT_ARG1) || (mode == MODE_WANT_ARG1_OR_OP)) {
displaymodule 0:3713b01e72fe 148 val1 = val1*10 + (arg - '0');
displaymodule 0:3713b01e72fe 149 mode = MODE_WANT_ARG1_OR_OP;
displaymodule 0:3713b01e72fe 150 buff[strpos++] = arg;
displaymodule 0:3713b01e72fe 151 } else if ((mode == MODE_WANT_ARG2) || (mode == MODE_WANT_ARG2_OR_OP)) {
displaymodule 0:3713b01e72fe 152 val2 = val2*10 + (arg - '0');
displaymodule 0:3713b01e72fe 153 mode = MODE_WANT_ARG2_OR_OP;
displaymodule 0:3713b01e72fe 154 buff[strpos++] = arg;
displaymodule 0:3713b01e72fe 155 }
displaymodule 0:3713b01e72fe 156 break;
displaymodule 0:3713b01e72fe 157 case '+':
displaymodule 0:3713b01e72fe 158 case '-':
displaymodule 0:3713b01e72fe 159 case '*':
displaymodule 0:3713b01e72fe 160 case '/':
displaymodule 0:3713b01e72fe 161 if (mode == MODE_WANT_ARG1_OR_OP) {
displaymodule 0:3713b01e72fe 162 op = arg;
displaymodule 0:3713b01e72fe 163 mode = MODE_WANT_ARG2;
displaymodule 0:3713b01e72fe 164 buff[strpos++] = arg;
displaymodule 0:3713b01e72fe 165 } else if (mode == MODE_WANT_ARG2_OR_OP) {
displaymodule 0:3713b01e72fe 166 // already have "a op b", calculate it and go to "c op"
displaymodule 0:3713b01e72fe 167 switch (op) {
displaymodule 0:3713b01e72fe 168 case '+': val1 = val1 + val2; break;
displaymodule 0:3713b01e72fe 169 case '-': val1 = val1 - val2; break;
displaymodule 0:3713b01e72fe 170 case '*': val1 = val1 * val2; break;
displaymodule 0:3713b01e72fe 171 case '/': val1 = val1 / val2; break;
displaymodule 0:3713b01e72fe 172 }
displaymodule 0:3713b01e72fe 173 op = arg;
displaymodule 0:3713b01e72fe 174 val2 = 0;
displaymodule 0:3713b01e72fe 175 mode = MODE_WANT_ARG2;
displaymodule 0:3713b01e72fe 176 strpos = sprintf(buff, "%d%c", val1, op);
displaymodule 0:3713b01e72fe 177 clearResult = true;
displaymodule 0:3713b01e72fe 178 }
displaymodule 0:3713b01e72fe 179 break;
displaymodule 0:3713b01e72fe 180 case 'c':
displaymodule 0:3713b01e72fe 181 val1 = val2 = op = 0;
displaymodule 0:3713b01e72fe 182 mode = MODE_WANT_ARG1;
displaymodule 0:3713b01e72fe 183 strpos = 0;
displaymodule 0:3713b01e72fe 184 clearResult = true;
displaymodule 0:3713b01e72fe 185 break;
displaymodule 0:3713b01e72fe 186 case '=':
displaymodule 0:3713b01e72fe 187 default:
displaymodule 0:3713b01e72fe 188 if (mode == MODE_WANT_ARG2_OR_OP) {
displaymodule 0:3713b01e72fe 189 // already have "a op b", calculate it and go to "c"
displaymodule 0:3713b01e72fe 190 switch (op) {
displaymodule 0:3713b01e72fe 191 case '+': val1 = val1 + val2; break;
displaymodule 0:3713b01e72fe 192 case '-': val1 = val1 - val2; break;
displaymodule 0:3713b01e72fe 193 case '*': val1 = val1 * val2; break;
displaymodule 0:3713b01e72fe 194 case '/': val1 = val1 / val2; break;
displaymodule 0:3713b01e72fe 195 }
displaymodule 0:3713b01e72fe 196 mode = MODE_WANT_ARG1_OR_OP;
displaymodule 0:3713b01e72fe 197 val2 = 0;
displaymodule 0:3713b01e72fe 198 strpos = sprintf(buff, "%d", val1);
displaymodule 0:3713b01e72fe 199 clearResult = true;
displaymodule 0:3713b01e72fe 200 }
displaymodule 0:3713b01e72fe 201 break;
displaymodule 0:3713b01e72fe 202 }
displaymodule 0:3713b01e72fe 203 buff[strpos] = '\0';
displaymodule 0:3713b01e72fe 204 redrawResult = true;
displaymodule 0:3713b01e72fe 205 }
displaymodule 0:3713b01e72fe 206
displaymodule 0:3713b01e72fe 207 /******************************************************************************
displaymodule 0:3713b01e72fe 208 * Main
displaymodule 0:3713b01e72fe 209 *****************************************************************************/
displaymodule 0:3713b01e72fe 210
embeddedartists 4:71588a1e3618 211 /*
embeddedartists 4:71588a1e3618 212 Hardware Setup:
embeddedartists 4:71588a1e3618 213
embeddedartists 4:71588a1e3618 214 - Jumpers JP1..JP6 should be in position 1-2
embeddedartists 4:71588a1e3618 215 - Jumpers in J14 should NOT be inserted
embeddedartists 4:71588a1e3618 216 - Jumper J7 should be inserted
embeddedartists 4:71588a1e3618 217 - Display in arduino socket J1 depending on display
embeddedartists 4:71588a1e3618 218 */
embeddedartists 4:71588a1e3618 219
embeddedartists 4:71588a1e3618 220 /*
embeddedartists 4:71588a1e3618 221 Test Comments:
embeddedartists 4:71588a1e3618 222
embeddedartists 4:71588a1e3618 223 - This example cannot be used with the DM-TFT18-101 or DM-TFT22-102 displays
embeddedartists 4:71588a1e3618 224 as they don't have touch support.
embeddedartists 4:71588a1e3618 225 - The DM-TFT22-102, DM-TFT28-103 and DM-TFT24-104 must all be used on top
embeddedartists 4:71588a1e3618 226 of the DM-ADTAU-001 board in the arduino J1 socket.
embeddedartists 4:71588a1e3618 227 - The DM-TFT28-105 and DM-TFT35-107 displays have direct arduino pinning and
embeddedartists 4:71588a1e3618 228 can be inserted directly in the J1 socket.
embeddedartists 4:71588a1e3618 229 */
embeddedartists 4:71588a1e3618 230
displaymodule 0:3713b01e72fe 231 int main() {
displaymodule 0:3713b01e72fe 232 uint16_t x = 0;
displaymodule 0:3713b01e72fe 233 uint16_t y = 0;
displaymodule 0:3713b01e72fe 234 uint16_t w = tft.width();
displaymodule 0:3713b01e72fe 235 uint16_t h = tft.height();
displaymodule 1:9a3ae682a75e 236 uint16_t size = (w - (BUTTONS_PER_LINE + 1)*MARGIN)/BUTTONS_PER_LINE;
displaymodule 1:9a3ae682a75e 237 uint16_t yoff = h - (size + MARGIN)*BUTTONS_NUM_LINES;
displaymodule 0:3713b01e72fe 238 bool down = false;
displaymodule 0:3713b01e72fe 239
displaymodule 0:3713b01e72fe 240 for (int i = 0; i < NUM_BUTTONS;i++) {
displaymodule 1:9a3ae682a75e 241 x = MARGIN + (size + MARGIN) * (i % BUTTONS_PER_LINE);
displaymodule 1:9a3ae682a75e 242 y = yoff + (size + MARGIN) * (i / BUTTONS_PER_LINE);
displaymodule 0:3713b01e72fe 243 buttons[i] = new Button(captions[i], x, y, size, size);
displaymodule 0:3713b01e72fe 244 buttons[i]->setAction(handleClick, captions[i][0]);
displaymodule 0:3713b01e72fe 245 }
displaymodule 0:3713b01e72fe 246
displaymodule 0:3713b01e72fe 247 tft.init();
displaymodule 0:3713b01e72fe 248 tft.clearScreen(BRIGHT_RED);
displaymodule 0:3713b01e72fe 249 tft.fillRectangle(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, BLACK);
displaymodule 0:3713b01e72fe 250 touch.init();
displaymodule 0:3713b01e72fe 251
displaymodule 0:3713b01e72fe 252 for (int i = 0; i < NUM_BUTTONS; i++) {
displaymodule 0:3713b01e72fe 253 buttons[i]->draw(&tft);
displaymodule 0:3713b01e72fe 254 }
displaymodule 0:3713b01e72fe 255
displaymodule 0:3713b01e72fe 256 while(true) {
displaymodule 0:3713b01e72fe 257 touch.readTouchData(x, y, down);
displaymodule 0:3713b01e72fe 258
displaymodule 2:b17b19212e5a 259 /* The following printouts are for some unexplainable reason needed
displaymodule 2:b17b19212e5a 260 on the LPC4088 QuickStart Board in combination with the MBED online compiler.
displaymodule 2:b17b19212e5a 261 The printouts are not needed when using an external compiler, e.g. Keil uVision
displaymodule 2:b17b19212e5a 262 or LPCXpresso IDE. */
displaymodule 2:b17b19212e5a 263 #if defined(__LPC407x_8x_177x_8x_H__)
displaymodule 2:b17b19212e5a 264 if (down) {
displaymodule 2:b17b19212e5a 265 printf("DOWN %4d, %4d\n", x, y);
displaymodule 2:b17b19212e5a 266 } else {
displaymodule 2:b17b19212e5a 267 printf("UP %4d, %4d\n", x, y);
displaymodule 2:b17b19212e5a 268 }
displaymodule 2:b17b19212e5a 269 #endif
displaymodule 2:b17b19212e5a 270
displaymodule 0:3713b01e72fe 271 for (int i = 0; i < NUM_BUTTONS; i++) {
displaymodule 0:3713b01e72fe 272 if (buttons[i]->handle(x, y, down)) {
displaymodule 0:3713b01e72fe 273 buttons[i]->draw(&tft);
displaymodule 0:3713b01e72fe 274 }
displaymodule 0:3713b01e72fe 275 }
displaymodule 0:3713b01e72fe 276 if (clearResult) {
displaymodule 0:3713b01e72fe 277 clearResult = false;
displaymodule 0:3713b01e72fe 278 tft.fillRectangle(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, BLACK);
displaymodule 0:3713b01e72fe 279 }
displaymodule 0:3713b01e72fe 280 if (redrawResult) {
displaymodule 0:3713b01e72fe 281 redrawResult = false;
displaymodule 0:3713b01e72fe 282 tft.drawStringCentered(RESULT_MARGIN_X, RESULT_MARGIN_Y, w-RESULT_MARGIN_X, yoff-RESULT_MARGIN_Y, &buff[0]);
displaymodule 0:3713b01e72fe 283 }
displaymodule 0:3713b01e72fe 284 wait(0.02);
displaymodule 0:3713b01e72fe 285 }
displaymodule 0:3713b01e72fe 286 }