mbed Paint for the RA8875 display with based touch screen.

Dependencies:   menu mbed RA8875

mPaint

mbed Paint - a demo for the (480x272) RA8875 Display with touchscreen.

Touch Screen

Having had several of the 4.3" WQVGA displays (that use the RA8875), I created the RA8875 driver library (initially derived derived from the work of others). Absent for some time was support for the touch-screen interface. Support first appeared with the contributions of others, and then a major update (due to a recent acquisition of a touch-screen version). This is now much more fully developed and it is part of the standard library.

Demo the Touch Screen

How to demonstrate the touch screen support? mPaint was created for just that purpose.

Screen Shots

Here's a couple of screen shots - you can capture the "canvas" (left) or the composite image (right). As you see, the composite picks up the menu information, however it remains subdued because of the transparency setting.

/media/uploads/WiredHome/mpaint_screen01.png/media/uploads/WiredHome/mpaint_screen02.png

Program Build Info

I'm sometimes a bit skeptical of the reported metrics (perhaps because most of my mbed applications have Ethernet), but here is the reported information from the build of this program.

mPaint Build Infoblinky Build Info
/media/uploads/WiredHome/mpaint_buildinfo.png/media/uploads/WiredHome/blinky_buildinfo.png
RA8875 Graphics library is the primary user.blinky is almost all "startup code" and standard libs

How does mPaint and the graphics library do this in about 1 kB RAM?

The answer is that the display is used as a "write-only" memory, and it has enough RAM hosted in the RA8875 for two full screens (in the WQVGA mode).

mPaint features

  • RGB color selection using touch, with a visible sample.
  • Pen size selection.
    From a limited set.
  • Tool choices.
    Dot, Line, Joined lines.
  • Save your creation.
    Select File | Save..., and it reads the display memory as it creates the BMP file on the local file system.
    This is rather slow (due to both the display read and the local file system).
  • Sorry, no undo.
    If you don't like what "ink" you put down, you can draw over it (much like other paint programs).
Committer:
WiredHome
Date:
Thu Jan 01 21:54:21 2015 +0000
Revision:
0:326a3f29e21b
Child:
1:0fdc10700ed2
mbed Paint for the RA8875

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:326a3f29e21b 1 //
WiredHome 0:326a3f29e21b 2 //
WiredHome 0:326a3f29e21b 3 // +----------------------------------------------------+
WiredHome 0:326a3f29e21b 4 // | File Edit Pen Tools [sample](o)[rrrr][gggg][bbbb] |
WiredHome 0:326a3f29e21b 5 // +----------------------------------------------------+
WiredHome 0:326a3f29e21b 6 // | |
WiredHome 0:326a3f29e21b 7 // | canvas |
WiredHome 0:326a3f29e21b 8 // | |
WiredHome 0:326a3f29e21b 9 // | |
WiredHome 0:326a3f29e21b 10 // | |
WiredHome 0:326a3f29e21b 11 // | |
WiredHome 0:326a3f29e21b 12 // | |
WiredHome 0:326a3f29e21b 13 // | |
WiredHome 0:326a3f29e21b 14 // | |
WiredHome 0:326a3f29e21b 15 // | |
WiredHome 0:326a3f29e21b 16 // +----------------------------------------------------+
WiredHome 0:326a3f29e21b 17 // | (xxx,yyy) - (xxx,yyy) rgb (RR,GG,BB) |
WiredHome 0:326a3f29e21b 18 // +----------------------------------------------------+
WiredHome 0:326a3f29e21b 19 //
WiredHome 0:326a3f29e21b 20 //
WiredHome 0:326a3f29e21b 21 #include "mbed.h" // tested with v92
WiredHome 0:326a3f29e21b 22 #include "RA8875.h" // tested with v80
WiredHome 0:326a3f29e21b 23 #include "menu.h"
WiredHome 0:326a3f29e21b 24
WiredHome 0:326a3f29e21b 25 // Local File System:
WiredHome 0:326a3f29e21b 26 // - Store the touch screen calibration
WiredHome 0:326a3f29e21b 27 // - Capture image in BMP format.
WiredHome 0:326a3f29e21b 28 LocalFileSystem local("local");
WiredHome 0:326a3f29e21b 29
WiredHome 0:326a3f29e21b 30 // The display interface
WiredHome 0:326a3f29e21b 31 RA8875 lcd(p5, p6, p7, p12, NC, "tft"); // MOSI, MISO, SCK, /ChipSelect, /reset, name
WiredHome 0:326a3f29e21b 32
WiredHome 0:326a3f29e21b 33 // A monitor port for the SW developer.
WiredHome 0:326a3f29e21b 34 Serial pc(USBTX, USBRX);
WiredHome 0:326a3f29e21b 35
WiredHome 0:326a3f29e21b 36 typedef enum {
WiredHome 0:326a3f29e21b 37 dot,
WiredHome 0:326a3f29e21b 38 line
WiredHome 0:326a3f29e21b 39 } tooltype_t; // what tool are we using to draw
WiredHome 0:326a3f29e21b 40
WiredHome 0:326a3f29e21b 41 color_t rgb = Black; // the composite color value
WiredHome 0:326a3f29e21b 42 uint8_t rgbVal[3] = { 0, 0, 0 }; // host each of the individual values
WiredHome 0:326a3f29e21b 43 uint32_t pensize = 1; // pensize is user selectable
WiredHome 0:326a3f29e21b 44 tooltype_t selectedtooltype = dot; // 0:dot, 1:line
WiredHome 0:326a3f29e21b 45 point_t origin = { 0, 0}; // tracks origin when drawing a line
WiredHome 0:326a3f29e21b 46
WiredHome 0:326a3f29e21b 47
WiredHome 0:326a3f29e21b 48 const rect_t RGBList[] = { // regions on the display for special tools
WiredHome 0:326a3f29e21b 49 { 309,0, 359,15 }, // R
WiredHome 0:326a3f29e21b 50 { 369,0, 419,15 }, // G
WiredHome 0:326a3f29e21b 51 { 429,0, 479,15 }, // B
WiredHome 0:326a3f29e21b 52 { 249,0, 299,15 } // show selected color
WiredHome 0:326a3f29e21b 53 };
WiredHome 0:326a3f29e21b 54 const rect_t canvas_rect = { // the drawing surface
WiredHome 0:326a3f29e21b 55 0,16, 479,271
WiredHome 0:326a3f29e21b 56 };
WiredHome 0:326a3f29e21b 57
WiredHome 0:326a3f29e21b 58
WiredHome 0:326a3f29e21b 59
WiredHome 0:326a3f29e21b 60 // File Pen Tools
WiredHome 0:326a3f29e21b 61 // New... Pensize 1 Dot
WiredHome 0:326a3f29e21b 62 // Save... Pensize 2 Line
WiredHome 0:326a3f29e21b 63 // Calibrate Pensize 4
WiredHome 0:326a3f29e21b 64 // Reset Pensize 6
WiredHome 0:326a3f29e21b 65 // Pensize 8
WiredHome 0:326a3f29e21b 66 //
WiredHome 0:326a3f29e21b 67 Menu::post_fnc_action_t File(uint32_t v);
WiredHome 0:326a3f29e21b 68 Menu::post_fnc_action_t File_New(uint32_t v);
WiredHome 0:326a3f29e21b 69 Menu::post_fnc_action_t File_Save(uint32_t v);
WiredHome 0:326a3f29e21b 70 Menu::post_fnc_action_t File_Save_All(uint32_t v);
WiredHome 0:326a3f29e21b 71 Menu::post_fnc_action_t File_Cal(uint32_t v);
WiredHome 0:326a3f29e21b 72 Menu::post_fnc_action_t File_Reset(uint32_t v);
WiredHome 0:326a3f29e21b 73 Menu::post_fnc_action_t Edit(uint32_t v);
WiredHome 0:326a3f29e21b 74 Menu::post_fnc_action_t Edit_Clear(uint32_t v);
WiredHome 0:326a3f29e21b 75 Menu::post_fnc_action_t Tools(uint32_t v);
WiredHome 0:326a3f29e21b 76 Menu::post_fnc_action_t Tools_Type(uint32_t v);
WiredHome 0:326a3f29e21b 77 Menu::post_fnc_action_t PenSize(uint32_t v);
WiredHome 0:326a3f29e21b 78
WiredHome 0:326a3f29e21b 79 // Some APIs
WiredHome 0:326a3f29e21b 80 extern "C" void mbed_reset();
WiredHome 0:326a3f29e21b 81 int GetScreenCapture(void);
WiredHome 0:326a3f29e21b 82 void CalibrateTS(void);
WiredHome 0:326a3f29e21b 83 void ShowSampleRGB(void);
WiredHome 0:326a3f29e21b 84 void InitDisplay(void);
WiredHome 0:326a3f29e21b 85
WiredHome 0:326a3f29e21b 86 Menu::menu_item_t file_menu[] = {
WiredHome 0:326a3f29e21b 87 // Prompt, onPress, onHold, OnRelease, parameter, child menu
WiredHome 0:326a3f29e21b 88 { "New...", File_New, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 89 { "Save...", File_Save, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 90 { "Save all", File_Save_All, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 91 { "Calibrate", File_Cal, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 92 { "Reset", NULL, NULL, File_Reset, 0, NULL },
WiredHome 0:326a3f29e21b 93 { NULL, NULL, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 94 };
WiredHome 0:326a3f29e21b 95
WiredHome 0:326a3f29e21b 96 Menu::menu_item_t pen_menu[] = {
WiredHome 0:326a3f29e21b 97 { "1 pix", NULL, NULL, PenSize, 1, NULL },
WiredHome 0:326a3f29e21b 98 { "2 pix", NULL, NULL, PenSize, 2, NULL },
WiredHome 0:326a3f29e21b 99 { "4 pix", NULL, NULL, PenSize, 4, NULL },
WiredHome 0:326a3f29e21b 100 { "6 pix", NULL, NULL, PenSize, 6, NULL },
WiredHome 0:326a3f29e21b 101 { "8 pix", NULL, NULL, PenSize, 8, NULL },
WiredHome 0:326a3f29e21b 102 { NULL, NULL, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 103 };
WiredHome 0:326a3f29e21b 104
WiredHome 0:326a3f29e21b 105 Menu::menu_item_t tools_menu[] = {
WiredHome 0:326a3f29e21b 106 { "point", NULL, NULL, Tools_Type, 0, NULL },
WiredHome 0:326a3f29e21b 107 { "line", NULL, NULL, Tools_Type, 1, NULL },
WiredHome 0:326a3f29e21b 108 { NULL, NULL, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 109 };
WiredHome 0:326a3f29e21b 110
WiredHome 0:326a3f29e21b 111 Menu::menu_item_t menudata[] = {
WiredHome 0:326a3f29e21b 112 { "File", File, NULL, NULL, 0, file_menu },
WiredHome 0:326a3f29e21b 113 { "Pen", NULL, NULL, NULL, 0, pen_menu },
WiredHome 0:326a3f29e21b 114 { "Tools", NULL, NULL, NULL, 0, tools_menu },
WiredHome 0:326a3f29e21b 115 { NULL, NULL, NULL, NULL, 0, NULL },
WiredHome 0:326a3f29e21b 116 };
WiredHome 0:326a3f29e21b 117
WiredHome 0:326a3f29e21b 118 Menu menu(lcd, menudata);
WiredHome 0:326a3f29e21b 119
WiredHome 0:326a3f29e21b 120 Menu::post_fnc_action_t File(uint32_t v)
WiredHome 0:326a3f29e21b 121 {
WiredHome 0:326a3f29e21b 122 printf("File\r\n");
WiredHome 0:326a3f29e21b 123 return Menu::no_action;
WiredHome 0:326a3f29e21b 124 }
WiredHome 0:326a3f29e21b 125 Menu::post_fnc_action_t File_New(uint32_t v)
WiredHome 0:326a3f29e21b 126 {
WiredHome 0:326a3f29e21b 127 printf("File_New\r\n");
WiredHome 0:326a3f29e21b 128 InitDisplay();
WiredHome 0:326a3f29e21b 129 return Menu::no_action;
WiredHome 0:326a3f29e21b 130 }
WiredHome 0:326a3f29e21b 131 Menu::post_fnc_action_t File_Save(uint32_t v)
WiredHome 0:326a3f29e21b 132 {
WiredHome 0:326a3f29e21b 133 printf("File_Save\r\n");
WiredHome 0:326a3f29e21b 134 RA8875::LayerMode_T l = lcd.GetLayerMode();
WiredHome 0:326a3f29e21b 135 lcd.SetLayerMode(RA8875::ShowLayer0);
WiredHome 0:326a3f29e21b 136 GetScreenCapture();
WiredHome 0:326a3f29e21b 137 lcd.SetLayerMode(RA8875::TransparentMode);
WiredHome 0:326a3f29e21b 138 return Menu::close_menu;
WiredHome 0:326a3f29e21b 139 }
WiredHome 0:326a3f29e21b 140 Menu::post_fnc_action_t File_Save_All(uint32_t v)
WiredHome 0:326a3f29e21b 141 {
WiredHome 0:326a3f29e21b 142 printf("File_Save_All\r\n");
WiredHome 0:326a3f29e21b 143 GetScreenCapture();
WiredHome 0:326a3f29e21b 144 return Menu::close_menu;
WiredHome 0:326a3f29e21b 145 }
WiredHome 0:326a3f29e21b 146 Menu::post_fnc_action_t File_Cal(uint32_t v)
WiredHome 0:326a3f29e21b 147 {
WiredHome 0:326a3f29e21b 148 printf("Tools_Cal\r\n");
WiredHome 0:326a3f29e21b 149 CalibrateTS();
WiredHome 0:326a3f29e21b 150 return Menu::no_action;
WiredHome 0:326a3f29e21b 151 }
WiredHome 0:326a3f29e21b 152 Menu::post_fnc_action_t File_Reset(uint32_t v)
WiredHome 0:326a3f29e21b 153 {
WiredHome 0:326a3f29e21b 154 printf("rebooting now...\r\n");
WiredHome 0:326a3f29e21b 155 wait_ms(1000);
WiredHome 0:326a3f29e21b 156 mbed_reset();
WiredHome 0:326a3f29e21b 157 return Menu::no_action;
WiredHome 0:326a3f29e21b 158 }
WiredHome 0:326a3f29e21b 159 Menu::post_fnc_action_t Edit(uint32_t v)
WiredHome 0:326a3f29e21b 160 {
WiredHome 0:326a3f29e21b 161 printf("Edit\r\n");
WiredHome 0:326a3f29e21b 162 return Menu::no_action;
WiredHome 0:326a3f29e21b 163 }
WiredHome 0:326a3f29e21b 164 Menu::post_fnc_action_t Tools(uint32_t v)
WiredHome 0:326a3f29e21b 165 {
WiredHome 0:326a3f29e21b 166 printf("Tools\r\n");
WiredHome 0:326a3f29e21b 167 return Menu::no_action;
WiredHome 0:326a3f29e21b 168 }
WiredHome 0:326a3f29e21b 169 Menu::post_fnc_action_t PenSize(uint32_t v)
WiredHome 0:326a3f29e21b 170 {
WiredHome 0:326a3f29e21b 171 pensize = v;
WiredHome 0:326a3f29e21b 172 if (pensize < 1)
WiredHome 0:326a3f29e21b 173 pensize = 1;
WiredHome 0:326a3f29e21b 174 else if (pensize > 8)
WiredHome 0:326a3f29e21b 175 pensize = 8;
WiredHome 0:326a3f29e21b 176 pc.printf("PenSize(%d)\r\n", pensize);
WiredHome 0:326a3f29e21b 177 ShowSampleRGB();
WiredHome 0:326a3f29e21b 178 return Menu::close_menu;
WiredHome 0:326a3f29e21b 179 }
WiredHome 0:326a3f29e21b 180 Menu::post_fnc_action_t Tools_Type(uint32_t v)
WiredHome 0:326a3f29e21b 181 {
WiredHome 0:326a3f29e21b 182 switch (v) {
WiredHome 0:326a3f29e21b 183 case 0: // dot
WiredHome 0:326a3f29e21b 184 case 1: // line
WiredHome 0:326a3f29e21b 185 selectedtooltype = (tooltype_t)v;
WiredHome 0:326a3f29e21b 186 break;
WiredHome 0:326a3f29e21b 187 default:
WiredHome 0:326a3f29e21b 188 break;
WiredHome 0:326a3f29e21b 189 }
WiredHome 0:326a3f29e21b 190 ShowSampleRGB();
WiredHome 0:326a3f29e21b 191 return Menu::close_menu;
WiredHome 0:326a3f29e21b 192 }
WiredHome 0:326a3f29e21b 193
WiredHome 0:326a3f29e21b 194 void ShowSampleRGB(void)
WiredHome 0:326a3f29e21b 195 {
WiredHome 0:326a3f29e21b 196 lcd.fillrect(RGBList[3], Black);
WiredHome 0:326a3f29e21b 197 lcd.fillrect(RGBList[3], rgb);
WiredHome 0:326a3f29e21b 198 if (selectedtooltype == 0) {
WiredHome 0:326a3f29e21b 199 lcd.fillcircle(275,8, pensize, rgb);
WiredHome 0:326a3f29e21b 200 } else {
WiredHome 0:326a3f29e21b 201 lcd.fillrect(270,8-pensize/2, 280,8+pensize/2, rgb);
WiredHome 0:326a3f29e21b 202 }
WiredHome 0:326a3f29e21b 203 }
WiredHome 0:326a3f29e21b 204
WiredHome 0:326a3f29e21b 205 void CalibrateTS(void)
WiredHome 0:326a3f29e21b 206 {
WiredHome 0:326a3f29e21b 207 FILE * fh;
WiredHome 0:326a3f29e21b 208 tpMatrix_t matrix;
WiredHome 0:326a3f29e21b 209 RetCode_t r;
WiredHome 0:326a3f29e21b 210
WiredHome 0:326a3f29e21b 211 r = lcd.TouchPanelCalibrate("Calibrate the touch panel", &matrix);
WiredHome 0:326a3f29e21b 212 pc.printf(" ret: %d\r\n", r);
WiredHome 0:326a3f29e21b 213 if (r == noerror) {
WiredHome 0:326a3f29e21b 214 fh = fopen("/local/tpcal.cfg", "wb");
WiredHome 0:326a3f29e21b 215 if (fh) {
WiredHome 0:326a3f29e21b 216 fwrite(&matrix, sizeof(tpMatrix_t), 1, fh);
WiredHome 0:326a3f29e21b 217 fclose(fh);
WiredHome 0:326a3f29e21b 218 pc.printf(" tp cal written.\r\n");
WiredHome 0:326a3f29e21b 219 } else {
WiredHome 0:326a3f29e21b 220 pc.printf(" couldn't open tpcal file.\r\n");
WiredHome 0:326a3f29e21b 221 }
WiredHome 0:326a3f29e21b 222 } else {
WiredHome 0:326a3f29e21b 223 pc.printf("error return: %d\r\n", r);
WiredHome 0:326a3f29e21b 224 }
WiredHome 0:326a3f29e21b 225 }
WiredHome 0:326a3f29e21b 226
WiredHome 0:326a3f29e21b 227
WiredHome 0:326a3f29e21b 228 void InitTS(void)
WiredHome 0:326a3f29e21b 229 {
WiredHome 0:326a3f29e21b 230 FILE * fh;
WiredHome 0:326a3f29e21b 231 tpMatrix_t matrix;
WiredHome 0:326a3f29e21b 232
WiredHome 0:326a3f29e21b 233 fh = fopen("/local/tpcal.cfg", "rb");
WiredHome 0:326a3f29e21b 234 if (fh) {
WiredHome 0:326a3f29e21b 235 fread(&matrix, sizeof(tpMatrix_t), 1, fh);
WiredHome 0:326a3f29e21b 236 fclose(fh);
WiredHome 0:326a3f29e21b 237 lcd.TouchPanelSetMatrix(&matrix);
WiredHome 0:326a3f29e21b 238 pc.printf(" tp cal loaded.\r\n");
WiredHome 0:326a3f29e21b 239 } else {
WiredHome 0:326a3f29e21b 240 CalibrateTS();
WiredHome 0:326a3f29e21b 241 }
WiredHome 0:326a3f29e21b 242 }
WiredHome 0:326a3f29e21b 243
WiredHome 0:326a3f29e21b 244
WiredHome 0:326a3f29e21b 245 void InitDisplay(void)
WiredHome 0:326a3f29e21b 246 {
WiredHome 0:326a3f29e21b 247 lcd.cls(3); // both layers
WiredHome 0:326a3f29e21b 248 lcd.SelectDrawingLayer(CANVAS);
WiredHome 0:326a3f29e21b 249 lcd.fillrect(RGBList[0], Red);
WiredHome 0:326a3f29e21b 250 lcd.fillrect(RGBList[1], Green);
WiredHome 0:326a3f29e21b 251 lcd.fillrect(RGBList[2], Blue);
WiredHome 0:326a3f29e21b 252 lcd.foreground(Blue);
WiredHome 0:326a3f29e21b 253 lcd.background(Black);
WiredHome 0:326a3f29e21b 254 }
WiredHome 0:326a3f29e21b 255
WiredHome 0:326a3f29e21b 256 int GetScreenCapture(void)
WiredHome 0:326a3f29e21b 257 {
WiredHome 0:326a3f29e21b 258 char fqfn[50];
WiredHome 0:326a3f29e21b 259 int i = 0;
WiredHome 0:326a3f29e21b 260
WiredHome 0:326a3f29e21b 261 pc.printf("Screen Capture... ");
WiredHome 0:326a3f29e21b 262 for (i=1; i< 100; i++) {
WiredHome 0:326a3f29e21b 263 snprintf(fqfn, sizeof(fqfn), "/local/Screen%02d.bmp", i);
WiredHome 0:326a3f29e21b 264 FILE * fh = fopen(fqfn, "rb");
WiredHome 0:326a3f29e21b 265 if (!fh) {
WiredHome 0:326a3f29e21b 266 lcd.PrintScreen(0,0,480,272,fqfn);
WiredHome 0:326a3f29e21b 267 pc.printf(" as /local/Screen%02d.bmp\r\n", i);
WiredHome 0:326a3f29e21b 268 return i;
WiredHome 0:326a3f29e21b 269 } else {
WiredHome 0:326a3f29e21b 270 fclose(fh); // close this and try the next
WiredHome 0:326a3f29e21b 271 }
WiredHome 0:326a3f29e21b 272 }
WiredHome 0:326a3f29e21b 273 return 0;
WiredHome 0:326a3f29e21b 274 }
WiredHome 0:326a3f29e21b 275
WiredHome 0:326a3f29e21b 276 void SeeIfUserSelectingRGBValues(point_t p)
WiredHome 0:326a3f29e21b 277 {
WiredHome 0:326a3f29e21b 278 // See if the touch is setting new RGB values
WiredHome 0:326a3f29e21b 279 for (int i=0; i<3; i++) {
WiredHome 0:326a3f29e21b 280 if (lcd.Intersect(RGBList[i], p)) {
WiredHome 0:326a3f29e21b 281 uint8_t mag = (255 * (p.x - RGBList[i].p1.x)) / (RGBList[i].p2.x - RGBList[i].p1.x);
WiredHome 0:326a3f29e21b 282 rgbVal[i] = mag;
WiredHome 0:326a3f29e21b 283 // update the RGB values
WiredHome 0:326a3f29e21b 284 lcd.SelectDrawingLayer(MENUS);
WiredHome 0:326a3f29e21b 285 lcd.SetTextCursor(380, 255);
WiredHome 0:326a3f29e21b 286 lcd.foreground(Blue);
WiredHome 0:326a3f29e21b 287 lcd.printf("(%02X,%02X,%02X)", rgbVal[0], rgbVal[1], rgbVal[2]);
WiredHome 0:326a3f29e21b 288 // show sample
WiredHome 0:326a3f29e21b 289 rgb = RGB(rgbVal[0], rgbVal[1], rgbVal[2]);
WiredHome 0:326a3f29e21b 290 ShowSampleRGB();
WiredHome 0:326a3f29e21b 291 //
WiredHome 0:326a3f29e21b 292 lcd.SelectDrawingLayer(CANVAS);
WiredHome 0:326a3f29e21b 293 lcd.foreground(rgb);
WiredHome 0:326a3f29e21b 294 break;
WiredHome 0:326a3f29e21b 295 }
WiredHome 0:326a3f29e21b 296 }
WiredHome 0:326a3f29e21b 297 }
WiredHome 0:326a3f29e21b 298
WiredHome 0:326a3f29e21b 299 void SeeIfUserDrawingOnCanvas(point_t p, TouchCode_t touchcode)
WiredHome 0:326a3f29e21b 300 {
WiredHome 0:326a3f29e21b 301 if (lcd.Intersect(canvas_rect, p)) {
WiredHome 0:326a3f29e21b 302 switch (selectedtooltype) {
WiredHome 0:326a3f29e21b 303 case dot:
WiredHome 0:326a3f29e21b 304 lcd.fillcircle(p, pensize, rgb);
WiredHome 0:326a3f29e21b 305 break;
WiredHome 0:326a3f29e21b 306 case line:
WiredHome 0:326a3f29e21b 307 if (touchcode == touch) {
WiredHome 0:326a3f29e21b 308 lcd.fillcircle(p, 1, rgb);
WiredHome 0:326a3f29e21b 309 origin = p;
WiredHome 0:326a3f29e21b 310 pc.printf("Origin @ (%3d,%3d)\r\n", p.x, p.y);
WiredHome 0:326a3f29e21b 311 } else if (touchcode == release) {
WiredHome 0:326a3f29e21b 312 double angleN = 0;
WiredHome 0:326a3f29e21b 313 loc_t dy = 0;
WiredHome 0:326a3f29e21b 314 loc_t dx = 0;
WiredHome 0:326a3f29e21b 315 int thickness = 0;
WiredHome 0:326a3f29e21b 316 point_t s = { 0, 0 };
WiredHome 0:326a3f29e21b 317 point_t e = { 0, 0 };
WiredHome 0:326a3f29e21b 318
WiredHome 0:326a3f29e21b 319 lcd.line(origin,p, rgb);
WiredHome 0:326a3f29e21b 320 pc.printf(" End @ (%3d,%3d) - (%3d,%3d) [%d]\r\n", origin.x, origin.y, p.x, p.y, pensize);
WiredHome 0:326a3f29e21b 321 #define PI 3.14159
WiredHome 0:326a3f29e21b 322 dy = p.y - origin.y;
WiredHome 0:326a3f29e21b 323 dx = p.x - origin.x;
WiredHome 0:326a3f29e21b 324 printf("delta (%+3d,%+3d)\r\n", dx,dy);
WiredHome 0:326a3f29e21b 325 angleN = atan2((double)(p.y-origin.y), (double)(p.x-origin.x));
WiredHome 0:326a3f29e21b 326 thickness = pensize;
WiredHome 0:326a3f29e21b 327 for (int l=-thickness; l<=thickness; l++) {
WiredHome 0:326a3f29e21b 328 s.x = origin.x + l * cos(angleN+PI/2);
WiredHome 0:326a3f29e21b 329 s.y = origin.y + l * sin(angleN+PI/2);
WiredHome 0:326a3f29e21b 330 e.x = p.x + l * cos(angleN+PI/2);
WiredHome 0:326a3f29e21b 331 e.y = p.y + l * sin(angleN+PI/2);
WiredHome 0:326a3f29e21b 332 lcd.line(s, e, rgb);
WiredHome 0:326a3f29e21b 333 pc.printf(" %+d @ (%3d,%3d) - (%3d,%3d) a:%+3.2f:%+3.2f\r\n",
WiredHome 0:326a3f29e21b 334 l, s.x,s.y, e.x,e.y, angleN, angleN+PI/2);
WiredHome 0:326a3f29e21b 335 }
WiredHome 0:326a3f29e21b 336 }
WiredHome 0:326a3f29e21b 337 break;
WiredHome 0:326a3f29e21b 338 default:
WiredHome 0:326a3f29e21b 339 break;
WiredHome 0:326a3f29e21b 340 }
WiredHome 0:326a3f29e21b 341 }
WiredHome 0:326a3f29e21b 342 }
WiredHome 0:326a3f29e21b 343
WiredHome 0:326a3f29e21b 344
WiredHome 0:326a3f29e21b 345 int main()
WiredHome 0:326a3f29e21b 346 {
WiredHome 0:326a3f29e21b 347 pc.baud(460800); // I like a snappy terminal, so crank it up!
WiredHome 0:326a3f29e21b 348 pc.printf("\r\nRA8875 Menu - Build " __DATE__ " " __TIME__ "\r\n");
WiredHome 0:326a3f29e21b 349
WiredHome 0:326a3f29e21b 350 pc.printf("Turning on display\r\n");
WiredHome 0:326a3f29e21b 351 lcd.init();
WiredHome 0:326a3f29e21b 352 menu.init();
WiredHome 0:326a3f29e21b 353 InitTS();
WiredHome 0:326a3f29e21b 354 InitDisplay();
WiredHome 0:326a3f29e21b 355
WiredHome 0:326a3f29e21b 356 pc.printf("processing loop...\r\n");
WiredHome 0:326a3f29e21b 357
WiredHome 0:326a3f29e21b 358 for (;;) {
WiredHome 0:326a3f29e21b 359 point_t p;
WiredHome 0:326a3f29e21b 360 TouchCode_t touchcode = lcd.TouchPanelReadable(&p);
WiredHome 0:326a3f29e21b 361
WiredHome 0:326a3f29e21b 362 if (touchcode != no_touch) {
WiredHome 0:326a3f29e21b 363 int curLayer = lcd.GetDrawingLayer();
WiredHome 0:326a3f29e21b 364 lcd.SelectDrawingLayer(MENUS);
WiredHome 0:326a3f29e21b 365 lcd.foreground(Blue);
WiredHome 0:326a3f29e21b 366 lcd.SetTextCursor(0, 255);
WiredHome 0:326a3f29e21b 367 lcd.printf("(%3d,%3d) - (%3d,%3d)", origin.x, origin.y, p.x, p.y);
WiredHome 0:326a3f29e21b 368 lcd.SelectDrawingLayer(curLayer);
WiredHome 0:326a3f29e21b 369
WiredHome 0:326a3f29e21b 370 bool menuHandledIt = menu.HandledTouch(p, touchcode);
WiredHome 0:326a3f29e21b 371 if (menuHandledIt) {
WiredHome 0:326a3f29e21b 372 // menu handled it
WiredHome 0:326a3f29e21b 373 } else {
WiredHome 0:326a3f29e21b 374 // app to handle the touch
WiredHome 0:326a3f29e21b 375 if (!menu.isVisible()) {
WiredHome 0:326a3f29e21b 376 SeeIfUserSelectingRGBValues(p);
WiredHome 0:326a3f29e21b 377 SeeIfUserDrawingOnCanvas(p, touchcode);
WiredHome 0:326a3f29e21b 378 } else { /* MENU */
WiredHome 0:326a3f29e21b 379 pc.printf("on menu - invalid x,y\r\n");
WiredHome 0:326a3f29e21b 380 menu.Hide();
WiredHome 0:326a3f29e21b 381 }
WiredHome 0:326a3f29e21b 382 }
WiredHome 0:326a3f29e21b 383 } else {
WiredHome 0:326a3f29e21b 384 //non-touch
WiredHome 0:326a3f29e21b 385 }
WiredHome 0:326a3f29e21b 386 }
WiredHome 0:326a3f29e21b 387 }
WiredHome 0:326a3f29e21b 388 #include <stdarg.h>
WiredHome 0:326a3f29e21b 389 //Custom override for error()
WiredHome 0:326a3f29e21b 390 void error(const char* format, ...)
WiredHome 0:326a3f29e21b 391 {
WiredHome 0:326a3f29e21b 392 char sprintf_buffer[128];
WiredHome 0:326a3f29e21b 393
WiredHome 0:326a3f29e21b 394 va_list arg;
WiredHome 0:326a3f29e21b 395 va_start(arg, format);
WiredHome 0:326a3f29e21b 396 vsprintf(sprintf_buffer, format, arg);
WiredHome 0:326a3f29e21b 397 va_end(arg);
WiredHome 0:326a3f29e21b 398
WiredHome 0:326a3f29e21b 399 fprintf(stderr, "SW err: %s", sprintf_buffer);
WiredHome 0:326a3f29e21b 400 }
WiredHome 0:326a3f29e21b 401
WiredHome 0:326a3f29e21b 402 // Reset_Handler
WiredHome 0:326a3f29e21b 403 // NMI_Handler
WiredHome 0:326a3f29e21b 404 // HardFault_Handler
WiredHome 0:326a3f29e21b 405 // MemManage_Handler
WiredHome 0:326a3f29e21b 406 // BusFault_Handler
WiredHome 0:326a3f29e21b 407 // UsageFault_Handler
WiredHome 0:326a3f29e21b 408 extern "C" void HardFault_Handler()
WiredHome 0:326a3f29e21b 409 {
WiredHome 0:326a3f29e21b 410 printf("\r\n\r\nHard Fault!\r\n");
WiredHome 0:326a3f29e21b 411 wait_ms(500);
WiredHome 0:326a3f29e21b 412 NVIC_SystemReset();
WiredHome 0:326a3f29e21b 413 }
WiredHome 0:326a3f29e21b 414 extern "C" void NMI_Handler()
WiredHome 0:326a3f29e21b 415 {
WiredHome 0:326a3f29e21b 416 printf("\r\n\r\nNMI Fault!\r\n");
WiredHome 0:326a3f29e21b 417 wait_ms(500);
WiredHome 0:326a3f29e21b 418 NVIC_SystemReset();
WiredHome 0:326a3f29e21b 419 }
WiredHome 0:326a3f29e21b 420 extern "C" void MemManage_Handler()
WiredHome 0:326a3f29e21b 421 {
WiredHome 0:326a3f29e21b 422 printf("\r\n\r\nMemManage Fault!\r\n");
WiredHome 0:326a3f29e21b 423 wait_ms(500);
WiredHome 0:326a3f29e21b 424 NVIC_SystemReset();
WiredHome 0:326a3f29e21b 425 }
WiredHome 0:326a3f29e21b 426 extern "C" void BusFault_Handler()
WiredHome 0:326a3f29e21b 427 {
WiredHome 0:326a3f29e21b 428 printf("\r\n\r\nBusFault Fault!\r\n");
WiredHome 0:326a3f29e21b 429 wait_ms(500);
WiredHome 0:326a3f29e21b 430 NVIC_SystemReset();
WiredHome 0:326a3f29e21b 431 }
WiredHome 0:326a3f29e21b 432 extern "C" void UsageFault_Handler()
WiredHome 0:326a3f29e21b 433 {
WiredHome 0:326a3f29e21b 434 printf("\r\n\r\nUsageFault Fault!\r\n");
WiredHome 0:326a3f29e21b 435 wait_ms(500);
WiredHome 0:326a3f29e21b 436 NVIC_SystemReset();
WiredHome 0:326a3f29e21b 437 }