Demo of RA8875 TFT touch display on Freescale FRDM-K64F Forked from David Smart https://developer.mbed.org/users/WiredHome/

Dependencies:   RA8875 menu SDFileSystem mbed

Fork of PUB_RA8875_mPaint by David Smart

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 }