Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: RA8875 menu SDFileSystem mbed
Fork of PUB_RA8875_mPaint by
main.cpp@3:3b214426761d, 2015-01-03 (annotated)
- Committer:
- WiredHome
- Date:
- Sat Jan 03 17:12:02 2015 +0000
- Revision:
- 3:3b214426761d
- Parent:
- 2:cf295dad3192
- Child:
- 5:3afc5780b966
Move RGB selection to the other layer - less visual interference with the canvas drawing.
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:3b214426761d | 108 | Menu::post_fnc_action_t HideMenu(uint32_t v); |
WiredHome | 0:326a3f29e21b | 109 | |
WiredHome | 0:326a3f29e21b | 110 | // Some APIs |
WiredHome | 0:326a3f29e21b | 111 | extern "C" void mbed_reset(); |
WiredHome | 0:326a3f29e21b | 112 | int GetScreenCapture(void); |
WiredHome | 0:326a3f29e21b | 113 | void CalibrateTS(void); |
WiredHome | 0:326a3f29e21b | 114 | void ShowSampleRGB(void); |
WiredHome | 0:326a3f29e21b | 115 | void InitDisplay(void); |
WiredHome | 0:326a3f29e21b | 116 | |
WiredHome | 0:326a3f29e21b | 117 | Menu::menu_item_t file_menu[] = { |
WiredHome | 0:326a3f29e21b | 118 | // Prompt, onPress, onHold, OnRelease, parameter, child menu |
WiredHome | 0:326a3f29e21b | 119 | { "New...", File_New, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 120 | { "Save...", File_Save, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 121 | { "Save all", File_Save_All, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 122 | { "Calibrate", File_Cal, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 123 | { "Reset", NULL, NULL, File_Reset, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 124 | { NULL, NULL, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 125 | }; |
WiredHome | 0:326a3f29e21b | 126 | |
WiredHome | 0:326a3f29e21b | 127 | Menu::menu_item_t pen_menu[] = { |
WiredHome | 0:326a3f29e21b | 128 | { "1 pix", NULL, NULL, PenSize, 1, NULL }, |
WiredHome | 0:326a3f29e21b | 129 | { "2 pix", NULL, NULL, PenSize, 2, NULL }, |
WiredHome | 0:326a3f29e21b | 130 | { "4 pix", NULL, NULL, PenSize, 4, NULL }, |
WiredHome | 0:326a3f29e21b | 131 | { "6 pix", NULL, NULL, PenSize, 6, NULL }, |
WiredHome | 0:326a3f29e21b | 132 | { "8 pix", NULL, NULL, PenSize, 8, NULL }, |
WiredHome | 0:326a3f29e21b | 133 | { NULL, NULL, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 134 | }; |
WiredHome | 0:326a3f29e21b | 135 | |
WiredHome | 0:326a3f29e21b | 136 | Menu::menu_item_t tools_menu[] = { |
WiredHome | 1:0fdc10700ed2 | 137 | { "point", NULL, NULL, Tools_Type, dot, NULL }, |
WiredHome | 1:0fdc10700ed2 | 138 | { "line", NULL, NULL, Tools_Type, line, NULL }, |
WiredHome | 1:0fdc10700ed2 | 139 | { "join", NULL, NULL, Tools_Type, join, NULL }, |
WiredHome | 0:326a3f29e21b | 140 | { NULL, NULL, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 141 | }; |
WiredHome | 0:326a3f29e21b | 142 | |
WiredHome | 0:326a3f29e21b | 143 | Menu::menu_item_t menudata[] = { |
WiredHome | 0:326a3f29e21b | 144 | { "File", File, NULL, NULL, 0, file_menu }, |
WiredHome | 0:326a3f29e21b | 145 | { "Pen", NULL, NULL, NULL, 0, pen_menu }, |
WiredHome | 0:326a3f29e21b | 146 | { "Tools", NULL, NULL, NULL, 0, tools_menu }, |
WiredHome | 3:3b214426761d | 147 | { "Hide", NULL, NULL, HideMenu, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 148 | { NULL, NULL, NULL, NULL, 0, NULL }, |
WiredHome | 0:326a3f29e21b | 149 | }; |
WiredHome | 0:326a3f29e21b | 150 | |
WiredHome | 0:326a3f29e21b | 151 | Menu menu(lcd, menudata); |
WiredHome | 0:326a3f29e21b | 152 | |
WiredHome | 0:326a3f29e21b | 153 | Menu::post_fnc_action_t File(uint32_t v) |
WiredHome | 0:326a3f29e21b | 154 | { |
WiredHome | 3:3b214426761d | 155 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 156 | INFO("File"); |
WiredHome | 0:326a3f29e21b | 157 | return Menu::no_action; |
WiredHome | 0:326a3f29e21b | 158 | } |
WiredHome | 0:326a3f29e21b | 159 | Menu::post_fnc_action_t File_New(uint32_t v) |
WiredHome | 0:326a3f29e21b | 160 | { |
WiredHome | 3:3b214426761d | 161 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 162 | INFO("File_New"); |
WiredHome | 0:326a3f29e21b | 163 | InitDisplay(); |
WiredHome | 0:326a3f29e21b | 164 | return Menu::no_action; |
WiredHome | 0:326a3f29e21b | 165 | } |
WiredHome | 0:326a3f29e21b | 166 | Menu::post_fnc_action_t File_Save(uint32_t v) |
WiredHome | 0:326a3f29e21b | 167 | { |
WiredHome | 3:3b214426761d | 168 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 169 | INFO("File_Save"); |
WiredHome | 0:326a3f29e21b | 170 | RA8875::LayerMode_T l = lcd.GetLayerMode(); |
WiredHome | 0:326a3f29e21b | 171 | lcd.SetLayerMode(RA8875::ShowLayer0); |
WiredHome | 0:326a3f29e21b | 172 | GetScreenCapture(); |
WiredHome | 0:326a3f29e21b | 173 | lcd.SetLayerMode(RA8875::TransparentMode); |
WiredHome | 0:326a3f29e21b | 174 | return Menu::close_menu; |
WiredHome | 0:326a3f29e21b | 175 | } |
WiredHome | 0:326a3f29e21b | 176 | Menu::post_fnc_action_t File_Save_All(uint32_t v) |
WiredHome | 0:326a3f29e21b | 177 | { |
WiredHome | 3:3b214426761d | 178 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 179 | INFO("File_Save_All"); |
WiredHome | 0:326a3f29e21b | 180 | GetScreenCapture(); |
WiredHome | 0:326a3f29e21b | 181 | return Menu::close_menu; |
WiredHome | 0:326a3f29e21b | 182 | } |
WiredHome | 0:326a3f29e21b | 183 | Menu::post_fnc_action_t File_Cal(uint32_t v) |
WiredHome | 0:326a3f29e21b | 184 | { |
WiredHome | 3:3b214426761d | 185 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 186 | INFO("Tools_Cal"); |
WiredHome | 0:326a3f29e21b | 187 | CalibrateTS(); |
WiredHome | 0:326a3f29e21b | 188 | return Menu::no_action; |
WiredHome | 0:326a3f29e21b | 189 | } |
WiredHome | 0:326a3f29e21b | 190 | Menu::post_fnc_action_t File_Reset(uint32_t v) |
WiredHome | 0:326a3f29e21b | 191 | { |
WiredHome | 3:3b214426761d | 192 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 193 | INFO("rebooting now..."); |
WiredHome | 0:326a3f29e21b | 194 | wait_ms(1000); |
WiredHome | 0:326a3f29e21b | 195 | mbed_reset(); |
WiredHome | 0:326a3f29e21b | 196 | return Menu::no_action; |
WiredHome | 0:326a3f29e21b | 197 | } |
WiredHome | 0:326a3f29e21b | 198 | Menu::post_fnc_action_t Edit(uint32_t v) |
WiredHome | 0:326a3f29e21b | 199 | { |
WiredHome | 3:3b214426761d | 200 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 201 | INFO("Edit"); |
WiredHome | 0:326a3f29e21b | 202 | return Menu::no_action; |
WiredHome | 0:326a3f29e21b | 203 | } |
WiredHome | 0:326a3f29e21b | 204 | Menu::post_fnc_action_t Tools(uint32_t v) |
WiredHome | 0:326a3f29e21b | 205 | { |
WiredHome | 3:3b214426761d | 206 | (void)v; |
WiredHome | 1:0fdc10700ed2 | 207 | INFO("Tools"); |
WiredHome | 0:326a3f29e21b | 208 | return Menu::no_action; |
WiredHome | 0:326a3f29e21b | 209 | } |
WiredHome | 0:326a3f29e21b | 210 | Menu::post_fnc_action_t PenSize(uint32_t v) |
WiredHome | 0:326a3f29e21b | 211 | { |
WiredHome | 0:326a3f29e21b | 212 | pensize = v; |
WiredHome | 0:326a3f29e21b | 213 | if (pensize < 1) |
WiredHome | 0:326a3f29e21b | 214 | pensize = 1; |
WiredHome | 0:326a3f29e21b | 215 | else if (pensize > 8) |
WiredHome | 0:326a3f29e21b | 216 | pensize = 8; |
WiredHome | 1:0fdc10700ed2 | 217 | INFO("PenSize(%d)", pensize); |
WiredHome | 0:326a3f29e21b | 218 | ShowSampleRGB(); |
WiredHome | 0:326a3f29e21b | 219 | return Menu::close_menu; |
WiredHome | 0:326a3f29e21b | 220 | } |
WiredHome | 0:326a3f29e21b | 221 | Menu::post_fnc_action_t Tools_Type(uint32_t v) |
WiredHome | 0:326a3f29e21b | 222 | { |
WiredHome | 0:326a3f29e21b | 223 | switch (v) { |
WiredHome | 1:0fdc10700ed2 | 224 | case dot: |
WiredHome | 1:0fdc10700ed2 | 225 | case line: |
WiredHome | 1:0fdc10700ed2 | 226 | case join: |
WiredHome | 0:326a3f29e21b | 227 | selectedtooltype = (tooltype_t)v; |
WiredHome | 0:326a3f29e21b | 228 | break; |
WiredHome | 0:326a3f29e21b | 229 | default: |
WiredHome | 0:326a3f29e21b | 230 | break; |
WiredHome | 0:326a3f29e21b | 231 | } |
WiredHome | 0:326a3f29e21b | 232 | ShowSampleRGB(); |
WiredHome | 0:326a3f29e21b | 233 | return Menu::close_menu; |
WiredHome | 0:326a3f29e21b | 234 | } |
WiredHome | 3:3b214426761d | 235 | Menu::post_fnc_action_t HideMenu(uint32_t v) |
WiredHome | 3:3b214426761d | 236 | { |
WiredHome | 3:3b214426761d | 237 | (void)v; |
WiredHome | 3:3b214426761d | 238 | return Menu::close_menu; |
WiredHome | 3:3b214426761d | 239 | } |
WiredHome | 0:326a3f29e21b | 240 | |
WiredHome | 0:326a3f29e21b | 241 | void ShowSampleRGB(void) |
WiredHome | 0:326a3f29e21b | 242 | { |
WiredHome | 1:0fdc10700ed2 | 243 | loc_t middle = (RGBList[3].p1.y + RGBList[3].p2.y)/2; |
WiredHome | 0:326a3f29e21b | 244 | lcd.fillrect(RGBList[3], Black); |
WiredHome | 0:326a3f29e21b | 245 | lcd.fillrect(RGBList[3], rgb); |
WiredHome | 1:0fdc10700ed2 | 246 | if (selectedtooltype == dot) { |
WiredHome | 1:0fdc10700ed2 | 247 | lcd.fillcircle((RGBList[3].p1.x + RGBList[3].p2.x)/2, |
WiredHome | 1:0fdc10700ed2 | 248 | middle, pensize, rgb); |
WiredHome | 0:326a3f29e21b | 249 | } else { |
WiredHome | 1:0fdc10700ed2 | 250 | lcd.fillrect(RGBList[3].p1.x,middle-pensize/2, RGBList[3].p2.x,middle+pensize/2, rgb); |
WiredHome | 0:326a3f29e21b | 251 | } |
WiredHome | 0:326a3f29e21b | 252 | } |
WiredHome | 0:326a3f29e21b | 253 | |
WiredHome | 0:326a3f29e21b | 254 | void CalibrateTS(void) |
WiredHome | 0:326a3f29e21b | 255 | { |
WiredHome | 0:326a3f29e21b | 256 | FILE * fh; |
WiredHome | 0:326a3f29e21b | 257 | tpMatrix_t matrix; |
WiredHome | 0:326a3f29e21b | 258 | RetCode_t r; |
WiredHome | 0:326a3f29e21b | 259 | |
WiredHome | 0:326a3f29e21b | 260 | r = lcd.TouchPanelCalibrate("Calibrate the touch panel", &matrix); |
WiredHome | 1:0fdc10700ed2 | 261 | INFO(" ret: %d", r); |
WiredHome | 0:326a3f29e21b | 262 | if (r == noerror) { |
WiredHome | 0:326a3f29e21b | 263 | fh = fopen("/local/tpcal.cfg", "wb"); |
WiredHome | 0:326a3f29e21b | 264 | if (fh) { |
WiredHome | 0:326a3f29e21b | 265 | fwrite(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 0:326a3f29e21b | 266 | fclose(fh); |
WiredHome | 1:0fdc10700ed2 | 267 | INFO(" tp cal written."); |
WiredHome | 0:326a3f29e21b | 268 | } else { |
WiredHome | 1:0fdc10700ed2 | 269 | WARN(" couldn't open tpcal file."); |
WiredHome | 0:326a3f29e21b | 270 | } |
WiredHome | 0:326a3f29e21b | 271 | } else { |
WiredHome | 1:0fdc10700ed2 | 272 | ERR("error return: %d", r); |
WiredHome | 0:326a3f29e21b | 273 | } |
WiredHome | 0:326a3f29e21b | 274 | } |
WiredHome | 0:326a3f29e21b | 275 | |
WiredHome | 0:326a3f29e21b | 276 | |
WiredHome | 0:326a3f29e21b | 277 | void InitTS(void) |
WiredHome | 0:326a3f29e21b | 278 | { |
WiredHome | 0:326a3f29e21b | 279 | FILE * fh; |
WiredHome | 0:326a3f29e21b | 280 | tpMatrix_t matrix; |
WiredHome | 0:326a3f29e21b | 281 | |
WiredHome | 0:326a3f29e21b | 282 | fh = fopen("/local/tpcal.cfg", "rb"); |
WiredHome | 0:326a3f29e21b | 283 | if (fh) { |
WiredHome | 0:326a3f29e21b | 284 | fread(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 0:326a3f29e21b | 285 | fclose(fh); |
WiredHome | 0:326a3f29e21b | 286 | lcd.TouchPanelSetMatrix(&matrix); |
WiredHome | 1:0fdc10700ed2 | 287 | INFO(" tp cal loaded."); |
WiredHome | 0:326a3f29e21b | 288 | } else { |
WiredHome | 0:326a3f29e21b | 289 | CalibrateTS(); |
WiredHome | 0:326a3f29e21b | 290 | } |
WiredHome | 0:326a3f29e21b | 291 | } |
WiredHome | 0:326a3f29e21b | 292 | |
WiredHome | 0:326a3f29e21b | 293 | |
WiredHome | 0:326a3f29e21b | 294 | void InitDisplay(void) |
WiredHome | 0:326a3f29e21b | 295 | { |
WiredHome | 0:326a3f29e21b | 296 | lcd.SelectDrawingLayer(CANVAS); |
WiredHome | 3:3b214426761d | 297 | lcd.cls(); |
WiredHome | 0:326a3f29e21b | 298 | lcd.foreground(Blue); |
WiredHome | 0:326a3f29e21b | 299 | lcd.background(Black); |
WiredHome | 0:326a3f29e21b | 300 | } |
WiredHome | 0:326a3f29e21b | 301 | |
WiredHome | 0:326a3f29e21b | 302 | int GetScreenCapture(void) |
WiredHome | 0:326a3f29e21b | 303 | { |
WiredHome | 0:326a3f29e21b | 304 | char fqfn[50]; |
WiredHome | 0:326a3f29e21b | 305 | int i = 0; |
WiredHome | 0:326a3f29e21b | 306 | |
WiredHome | 1:0fdc10700ed2 | 307 | INFO("Screen Capture... "); |
WiredHome | 0:326a3f29e21b | 308 | for (i=1; i< 100; i++) { |
WiredHome | 0:326a3f29e21b | 309 | snprintf(fqfn, sizeof(fqfn), "/local/Screen%02d.bmp", i); |
WiredHome | 0:326a3f29e21b | 310 | FILE * fh = fopen(fqfn, "rb"); |
WiredHome | 0:326a3f29e21b | 311 | if (!fh) { |
WiredHome | 1:0fdc10700ed2 | 312 | lcd.PrintScreen(0,0,lcd.width(),lcd.height(),fqfn); |
WiredHome | 1:0fdc10700ed2 | 313 | INFO(" as /local/Screen%02d.bmp", i); |
WiredHome | 0:326a3f29e21b | 314 | return i; |
WiredHome | 0:326a3f29e21b | 315 | } else { |
WiredHome | 0:326a3f29e21b | 316 | fclose(fh); // close this and try the next |
WiredHome | 0:326a3f29e21b | 317 | } |
WiredHome | 0:326a3f29e21b | 318 | } |
WiredHome | 0:326a3f29e21b | 319 | return 0; |
WiredHome | 0:326a3f29e21b | 320 | } |
WiredHome | 0:326a3f29e21b | 321 | |
WiredHome | 3:3b214426761d | 322 | void ShowRGBSelectors(void) |
WiredHome | 0:326a3f29e21b | 323 | { |
WiredHome | 3:3b214426761d | 324 | uint16_t curLayer = lcd.GetDrawingLayer(); |
WiredHome | 3:3b214426761d | 325 | lcd.SelectDrawingLayer(MENUS); |
WiredHome | 3:3b214426761d | 326 | lcd.fillrect(RGBList[0], Red); |
WiredHome | 3:3b214426761d | 327 | lcd.fillrect(RGBList[1], Green); |
WiredHome | 3:3b214426761d | 328 | lcd.fillrect(RGBList[2], Blue); |
WiredHome | 3:3b214426761d | 329 | lcd.SelectDrawingLayer(curLayer); |
WiredHome | 3:3b214426761d | 330 | } |
WiredHome | 3:3b214426761d | 331 | |
WiredHome | 3:3b214426761d | 332 | bool SeeIfUserSelectingRGBValues(point_t p, TouchCode_t touchcode) |
WiredHome | 3:3b214426761d | 333 | { |
WiredHome | 3:3b214426761d | 334 | static bool wasIn = false; |
WiredHome | 3:3b214426761d | 335 | |
WiredHome | 0:326a3f29e21b | 336 | // See if the touch is setting new RGB values |
WiredHome | 0:326a3f29e21b | 337 | for (int i=0; i<3; i++) { |
WiredHome | 0:326a3f29e21b | 338 | if (lcd.Intersect(RGBList[i], p)) { |
WiredHome | 0:326a3f29e21b | 339 | uint8_t mag = (255 * (p.x - RGBList[i].p1.x)) / (RGBList[i].p2.x - RGBList[i].p1.x); |
WiredHome | 3:3b214426761d | 340 | wasIn = true; |
WiredHome | 3:3b214426761d | 341 | if (touchcode == touch) |
WiredHome | 3:3b214426761d | 342 | menu.Show(); |
WiredHome | 3:3b214426761d | 343 | else if (touchcode == release) |
WiredHome | 3:3b214426761d | 344 | menu.Hide(); |
WiredHome | 0:326a3f29e21b | 345 | rgbVal[i] = mag; |
WiredHome | 0:326a3f29e21b | 346 | // update the RGB values |
WiredHome | 0:326a3f29e21b | 347 | lcd.SelectDrawingLayer(MENUS); |
WiredHome | 3:3b214426761d | 348 | lcd.SetTextCursor(lcd.width() - 80, lcd.height() - 16); |
WiredHome | 0:326a3f29e21b | 349 | lcd.foreground(Blue); |
WiredHome | 0:326a3f29e21b | 350 | lcd.printf("(%02X,%02X,%02X)", rgbVal[0], rgbVal[1], rgbVal[2]); |
WiredHome | 0:326a3f29e21b | 351 | // show sample |
WiredHome | 0:326a3f29e21b | 352 | rgb = RGB(rgbVal[0], rgbVal[1], rgbVal[2]); |
WiredHome | 0:326a3f29e21b | 353 | ShowSampleRGB(); |
WiredHome | 0:326a3f29e21b | 354 | // |
WiredHome | 0:326a3f29e21b | 355 | lcd.SelectDrawingLayer(CANVAS); |
WiredHome | 0:326a3f29e21b | 356 | lcd.foreground(rgb); |
WiredHome | 3:3b214426761d | 357 | return true; |
WiredHome | 0:326a3f29e21b | 358 | } |
WiredHome | 0:326a3f29e21b | 359 | } |
WiredHome | 3:3b214426761d | 360 | if (wasIn) |
WiredHome | 3:3b214426761d | 361 | menu.Hide(); |
WiredHome | 3:3b214426761d | 362 | return false; |
WiredHome | 0:326a3f29e21b | 363 | } |
WiredHome | 0:326a3f29e21b | 364 | |
WiredHome | 1:0fdc10700ed2 | 365 | void ThickLine(point_t origin, point_t p) |
WiredHome | 1:0fdc10700ed2 | 366 | { |
WiredHome | 2:cf295dad3192 | 367 | double angleN; |
WiredHome | 2:cf295dad3192 | 368 | loc_t dy; |
WiredHome | 2:cf295dad3192 | 369 | loc_t dx; |
WiredHome | 1:0fdc10700ed2 | 370 | point_t s = { 0, 0 }; |
WiredHome | 1:0fdc10700ed2 | 371 | point_t e = { 0, 0 }; |
WiredHome | 1:0fdc10700ed2 | 372 | |
WiredHome | 1:0fdc10700ed2 | 373 | lcd.line(origin,p, rgb); |
WiredHome | 1:0fdc10700ed2 | 374 | INFO(" End @ (%3d,%3d) - (%3d,%3d) [%d]", origin.x, origin.y, p.x, p.y, pensize); |
WiredHome | 1:0fdc10700ed2 | 375 | #define PI 3.14159 |
WiredHome | 1:0fdc10700ed2 | 376 | dy = p.y - origin.y; |
WiredHome | 1:0fdc10700ed2 | 377 | dx = p.x - origin.x; |
WiredHome | 1:0fdc10700ed2 | 378 | INFO("delta (%+3d,%+3d)", dx,dy); |
WiredHome | 2:cf295dad3192 | 379 | angleN = atan2((double)(dy), (double)(dx)); |
WiredHome | 1:0fdc10700ed2 | 380 | if (pensize == 1) { |
WiredHome | 1:0fdc10700ed2 | 381 | lcd.line(origin, p, rgb); |
WiredHome | 1:0fdc10700ed2 | 382 | } else { |
WiredHome | 1:0fdc10700ed2 | 383 | int thickness = pensize/2; |
WiredHome | 1:0fdc10700ed2 | 384 | for (int l=0; l<=pensize; l++) { |
WiredHome | 1:0fdc10700ed2 | 385 | s.x = origin.x + (l - thickness) * cos(angleN+PI/2); |
WiredHome | 1:0fdc10700ed2 | 386 | s.y = origin.y + (l - thickness) * sin(angleN+PI/2); |
WiredHome | 1:0fdc10700ed2 | 387 | e.x = p.x + (l - thickness) * cos(angleN+PI/2); |
WiredHome | 1:0fdc10700ed2 | 388 | e.y = p.y + (l - thickness) * sin(angleN+PI/2); |
WiredHome | 1:0fdc10700ed2 | 389 | lcd.line(s, e, rgb); |
WiredHome | 1:0fdc10700ed2 | 390 | INFO(" %+d @ (%3d,%3d) - (%3d,%3d) a:%+3.2f:%+3.2f", |
WiredHome | 1:0fdc10700ed2 | 391 | l, s.x,s.y, e.x,e.y, angleN, angleN+PI/2); |
WiredHome | 1:0fdc10700ed2 | 392 | } |
WiredHome | 1:0fdc10700ed2 | 393 | } |
WiredHome | 1:0fdc10700ed2 | 394 | } |
WiredHome | 1:0fdc10700ed2 | 395 | |
WiredHome | 1:0fdc10700ed2 | 396 | |
WiredHome | 0:326a3f29e21b | 397 | void SeeIfUserDrawingOnCanvas(point_t p, TouchCode_t touchcode) |
WiredHome | 0:326a3f29e21b | 398 | { |
WiredHome | 0:326a3f29e21b | 399 | if (lcd.Intersect(canvas_rect, p)) { |
WiredHome | 0:326a3f29e21b | 400 | switch (selectedtooltype) { |
WiredHome | 0:326a3f29e21b | 401 | case dot: |
WiredHome | 1:0fdc10700ed2 | 402 | lcd.fillcircle(p, (pensize == 1) ? pensize : pensize/2, rgb); |
WiredHome | 0:326a3f29e21b | 403 | break; |
WiredHome | 0:326a3f29e21b | 404 | case line: |
WiredHome | 0:326a3f29e21b | 405 | if (touchcode == touch) { |
WiredHome | 0:326a3f29e21b | 406 | lcd.fillcircle(p, 1, rgb); |
WiredHome | 0:326a3f29e21b | 407 | origin = p; |
WiredHome | 1:0fdc10700ed2 | 408 | INFO("Origin @ (%3d,%3d)", p.x, p.y); |
WiredHome | 0:326a3f29e21b | 409 | } else if (touchcode == release) { |
WiredHome | 1:0fdc10700ed2 | 410 | ThickLine(origin, p); |
WiredHome | 0:326a3f29e21b | 411 | } |
WiredHome | 0:326a3f29e21b | 412 | break; |
WiredHome | 1:0fdc10700ed2 | 413 | case join: |
WiredHome | 1:0fdc10700ed2 | 414 | if (touchcode == touch) { |
WiredHome | 1:0fdc10700ed2 | 415 | lcd.fillcircle(p, 1, rgb); |
WiredHome | 1:0fdc10700ed2 | 416 | origin = p; |
WiredHome | 1:0fdc10700ed2 | 417 | INFO("Origin @ (%3d,%3d)", p.x, p.y); |
WiredHome | 1:0fdc10700ed2 | 418 | } else if (touchcode == release) { |
WiredHome | 1:0fdc10700ed2 | 419 | ThickLine(origin, p); |
WiredHome | 1:0fdc10700ed2 | 420 | } else if (touchcode == held) { |
WiredHome | 1:0fdc10700ed2 | 421 | ThickLine(origin, p); |
WiredHome | 1:0fdc10700ed2 | 422 | origin = p; |
WiredHome | 1:0fdc10700ed2 | 423 | INFO(" held @ (%3d,%3d)", p.x, p.y); |
WiredHome | 1:0fdc10700ed2 | 424 | } |
WiredHome | 1:0fdc10700ed2 | 425 | break; |
WiredHome | 0:326a3f29e21b | 426 | default: |
WiredHome | 0:326a3f29e21b | 427 | break; |
WiredHome | 0:326a3f29e21b | 428 | } |
WiredHome | 0:326a3f29e21b | 429 | } |
WiredHome | 0:326a3f29e21b | 430 | } |
WiredHome | 0:326a3f29e21b | 431 | |
WiredHome | 0:326a3f29e21b | 432 | |
WiredHome | 0:326a3f29e21b | 433 | int main() |
WiredHome | 0:326a3f29e21b | 434 | { |
WiredHome | 0:326a3f29e21b | 435 | pc.baud(460800); // I like a snappy terminal, so crank it up! |
WiredHome | 0:326a3f29e21b | 436 | pc.printf("\r\nRA8875 Menu - Build " __DATE__ " " __TIME__ "\r\n"); |
WiredHome | 0:326a3f29e21b | 437 | |
WiredHome | 1:0fdc10700ed2 | 438 | INFO("Turning on display"); |
WiredHome | 0:326a3f29e21b | 439 | lcd.init(); |
WiredHome | 0:326a3f29e21b | 440 | InitTS(); |
WiredHome | 0:326a3f29e21b | 441 | InitDisplay(); |
WiredHome | 3:3b214426761d | 442 | menu.init(); |
WiredHome | 3:3b214426761d | 443 | ShowRGBSelectors(); |
WiredHome | 0:326a3f29e21b | 444 | |
WiredHome | 1:0fdc10700ed2 | 445 | INFO("processing loop..."); |
WiredHome | 0:326a3f29e21b | 446 | |
WiredHome | 0:326a3f29e21b | 447 | for (;;) { |
WiredHome | 0:326a3f29e21b | 448 | point_t p; |
WiredHome | 0:326a3f29e21b | 449 | TouchCode_t touchcode = lcd.TouchPanelReadable(&p); |
WiredHome | 0:326a3f29e21b | 450 | |
WiredHome | 0:326a3f29e21b | 451 | if (touchcode != no_touch) { |
WiredHome | 0:326a3f29e21b | 452 | int curLayer = lcd.GetDrawingLayer(); |
WiredHome | 0:326a3f29e21b | 453 | lcd.SelectDrawingLayer(MENUS); |
WiredHome | 0:326a3f29e21b | 454 | lcd.foreground(Blue); |
WiredHome | 3:3b214426761d | 455 | lcd.SetTextCursor(0, lcd.height() - 16); |
WiredHome | 0:326a3f29e21b | 456 | lcd.printf("(%3d,%3d) - (%3d,%3d)", origin.x, origin.y, p.x, p.y); |
WiredHome | 0:326a3f29e21b | 457 | lcd.SelectDrawingLayer(curLayer); |
WiredHome | 0:326a3f29e21b | 458 | |
WiredHome | 0:326a3f29e21b | 459 | bool menuHandledIt = menu.HandledTouch(p, touchcode); |
WiredHome | 0:326a3f29e21b | 460 | if (menuHandledIt) { |
WiredHome | 0:326a3f29e21b | 461 | // menu handled it |
WiredHome | 3:3b214426761d | 462 | } else if (SeeIfUserSelectingRGBValues(p, touchcode)) { |
WiredHome | 3:3b214426761d | 463 | // that handled it. |
WiredHome | 0:326a3f29e21b | 464 | } else { |
WiredHome | 3:3b214426761d | 465 | SeeIfUserDrawingOnCanvas(p, touchcode); |
WiredHome | 0:326a3f29e21b | 466 | } |
WiredHome | 0:326a3f29e21b | 467 | } else { |
WiredHome | 0:326a3f29e21b | 468 | //non-touch |
WiredHome | 0:326a3f29e21b | 469 | } |
WiredHome | 0:326a3f29e21b | 470 | } |
WiredHome | 0:326a3f29e21b | 471 | } |
WiredHome | 0:326a3f29e21b | 472 | #include <stdarg.h> |
WiredHome | 0:326a3f29e21b | 473 | //Custom override for error() |
WiredHome | 0:326a3f29e21b | 474 | void error(const char* format, ...) |
WiredHome | 0:326a3f29e21b | 475 | { |
WiredHome | 0:326a3f29e21b | 476 | char sprintf_buffer[128]; |
WiredHome | 0:326a3f29e21b | 477 | |
WiredHome | 0:326a3f29e21b | 478 | va_list arg; |
WiredHome | 0:326a3f29e21b | 479 | va_start(arg, format); |
WiredHome | 0:326a3f29e21b | 480 | vsprintf(sprintf_buffer, format, arg); |
WiredHome | 0:326a3f29e21b | 481 | va_end(arg); |
WiredHome | 0:326a3f29e21b | 482 | |
WiredHome | 0:326a3f29e21b | 483 | fprintf(stderr, "SW err: %s", sprintf_buffer); |
WiredHome | 0:326a3f29e21b | 484 | } |
WiredHome | 0:326a3f29e21b | 485 | |
WiredHome | 0:326a3f29e21b | 486 | // Reset_Handler |
WiredHome | 0:326a3f29e21b | 487 | // NMI_Handler |
WiredHome | 0:326a3f29e21b | 488 | // HardFault_Handler |
WiredHome | 0:326a3f29e21b | 489 | // MemManage_Handler |
WiredHome | 0:326a3f29e21b | 490 | // BusFault_Handler |
WiredHome | 0:326a3f29e21b | 491 | // UsageFault_Handler |
WiredHome | 0:326a3f29e21b | 492 | extern "C" void HardFault_Handler() |
WiredHome | 0:326a3f29e21b | 493 | { |
WiredHome | 0:326a3f29e21b | 494 | printf("\r\n\r\nHard Fault!\r\n"); |
WiredHome | 0:326a3f29e21b | 495 | wait_ms(500); |
WiredHome | 0:326a3f29e21b | 496 | NVIC_SystemReset(); |
WiredHome | 0:326a3f29e21b | 497 | } |
WiredHome | 0:326a3f29e21b | 498 | extern "C" void NMI_Handler() |
WiredHome | 0:326a3f29e21b | 499 | { |
WiredHome | 0:326a3f29e21b | 500 | printf("\r\n\r\nNMI Fault!\r\n"); |
WiredHome | 0:326a3f29e21b | 501 | wait_ms(500); |
WiredHome | 0:326a3f29e21b | 502 | NVIC_SystemReset(); |
WiredHome | 0:326a3f29e21b | 503 | } |
WiredHome | 0:326a3f29e21b | 504 | extern "C" void MemManage_Handler() |
WiredHome | 0:326a3f29e21b | 505 | { |
WiredHome | 0:326a3f29e21b | 506 | printf("\r\n\r\nMemManage Fault!\r\n"); |
WiredHome | 0:326a3f29e21b | 507 | wait_ms(500); |
WiredHome | 0:326a3f29e21b | 508 | NVIC_SystemReset(); |
WiredHome | 0:326a3f29e21b | 509 | } |
WiredHome | 0:326a3f29e21b | 510 | extern "C" void BusFault_Handler() |
WiredHome | 0:326a3f29e21b | 511 | { |
WiredHome | 0:326a3f29e21b | 512 | printf("\r\n\r\nBusFault Fault!\r\n"); |
WiredHome | 0:326a3f29e21b | 513 | wait_ms(500); |
WiredHome | 0:326a3f29e21b | 514 | NVIC_SystemReset(); |
WiredHome | 0:326a3f29e21b | 515 | } |
WiredHome | 0:326a3f29e21b | 516 | extern "C" void UsageFault_Handler() |
WiredHome | 0:326a3f29e21b | 517 | { |
WiredHome | 0:326a3f29e21b | 518 | printf("\r\n\r\nUsageFault Fault!\r\n"); |
WiredHome | 0:326a3f29e21b | 519 | wait_ms(500); |
WiredHome | 0:326a3f29e21b | 520 | NVIC_SystemReset(); |
WiredHome | 0:326a3f29e21b | 521 | } |