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:
Fri Jan 02 23:19:26 2015 +0000
Revision:
1:0fdc10700ed2
Parent:
0:326a3f29e21b
Child:
2:cf295dad3192
Adjust the "dot" size to more accurately reflect the desired size.; Code cleanup.

Who changed what in which revision?

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