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
main.cpp@0:326a3f29e21b, 2015-01-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |