David Smart
/
PUB_RA8875_TouchColors
An example program using the RA8875 Display controller with the touch-screen option.
main.cpp@7:5194e00baf6f, 2020-03-28 (annotated)
- Committer:
- WiredHome
- Date:
- Sat Mar 28 15:35:02 2020 +0000
- Revision:
- 7:5194e00baf6f
- Parent:
- 6:813c99fda5da
Breaking change update to RA8875 Library. Improved APIs, Improved Portrait Mode, Code Cleanup.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WiredHome | 0:2b1669e97586 | 1 | |
WiredHome | 3:45ef2ebfeebc | 2 | #include "mbed.h" // tested with v112 |
WiredHome | 3:45ef2ebfeebc | 3 | #include "RA8875.h" // tested with v102 |
WiredHome | 0:2b1669e97586 | 4 | |
WiredHome | 4:daf56708ae86 | 5 | |
WiredHome | 4:daf56708ae86 | 6 | const char * PROG_NAME = "RA8875 Touch Colors"; |
WiredHome | 4:daf56708ae86 | 7 | const char * BUILD_DATE = __DATE__ " " __TIME__; |
WiredHome | 4:daf56708ae86 | 8 | |
WiredHome | 4:daf56708ae86 | 9 | // Define this for 800x480 panel, undefine for 480x272 |
WiredHome | 6:813c99fda5da | 10 | #define BIG_SCREEN |
WiredHome | 4:daf56708ae86 | 11 | |
WiredHome | 4:daf56708ae86 | 12 | // Define this for Cap touch panel, undefine for resistive |
WiredHome | 6:813c99fda5da | 13 | #define CAP_TOUCH |
WiredHome | 4:daf56708ae86 | 14 | |
WiredHome | 4:daf56708ae86 | 15 | #ifdef CAP_TOUCH |
WiredHome | 4:daf56708ae86 | 16 | RA8875 lcd(p5, p6, p7, p12, NC, p9,p10,p13, "tft"); // SPI:{MOSI,MISO,SCK,/ChipSelect,/reset}, I2C:{SDA,SCL,/IRQ}, name |
WiredHome | 4:daf56708ae86 | 17 | #else |
WiredHome | 4:daf56708ae86 | 18 | RA8875 lcd(p5, p6, p7, p12, NC, "tft"); // SPI:{MOSI,MISO,SCK,/ChipSelect,/reset}, name |
WiredHome | 4:daf56708ae86 | 19 | LocalFileSystem local("local"); // access to calibration file for resistive touch. |
WiredHome | 4:daf56708ae86 | 20 | #endif |
WiredHome | 4:daf56708ae86 | 21 | |
WiredHome | 4:daf56708ae86 | 22 | #ifdef BIG_SCREEN |
WiredHome | 4:daf56708ae86 | 23 | #define LCD_W 800 |
WiredHome | 4:daf56708ae86 | 24 | #define LCD_H 480 |
WiredHome | 4:daf56708ae86 | 25 | #define LCD_C 8 // color - bits per pixel |
WiredHome | 4:daf56708ae86 | 26 | #define DEF_RADIUS 50 // default radius of the fingerprint |
WiredHome | 4:daf56708ae86 | 27 | #define BL_NORM 25 // Backlight Normal setting (0 to 255) |
WiredHome | 4:daf56708ae86 | 28 | #else |
WiredHome | 4:daf56708ae86 | 29 | #define LCD_W 480 |
WiredHome | 4:daf56708ae86 | 30 | #define LCD_H 272 |
WiredHome | 4:daf56708ae86 | 31 | #define LCD_C 8 // color - bits per pixel |
WiredHome | 4:daf56708ae86 | 32 | #define DEF_RADIUS 20 // default radius of the fingerprint |
WiredHome | 4:daf56708ae86 | 33 | #define BL_NORM 25 // Backlight Normal setting (0 to 255) |
WiredHome | 4:daf56708ae86 | 34 | #endif |
WiredHome | 4:daf56708ae86 | 35 | |
WiredHome | 0:2b1669e97586 | 36 | Serial pc(USBTX, USBRX); |
WiredHome | 0:2b1669e97586 | 37 | |
WiredHome | 0:2b1669e97586 | 38 | #define min(a,b) ((a<b)?a:b) |
WiredHome | 0:2b1669e97586 | 39 | #define max(a,b) ((a>b)?a:b) |
WiredHome | 0:2b1669e97586 | 40 | |
WiredHome | 1:47e5fbdb28f1 | 41 | int GetScreenCapture(void) |
WiredHome | 1:47e5fbdb28f1 | 42 | { |
WiredHome | 1:47e5fbdb28f1 | 43 | char fqfn[50]; |
WiredHome | 1:47e5fbdb28f1 | 44 | int i = 0; |
WiredHome | 1:47e5fbdb28f1 | 45 | |
WiredHome | 1:47e5fbdb28f1 | 46 | pc.printf("Screen Capture... "); |
WiredHome | 1:47e5fbdb28f1 | 47 | for (i=1; i< 100; i++) { |
WiredHome | 1:47e5fbdb28f1 | 48 | snprintf(fqfn, sizeof(fqfn), "/local/Screen%02d.bmp", i); |
WiredHome | 1:47e5fbdb28f1 | 49 | FILE * fh = fopen(fqfn, "rb"); |
WiredHome | 1:47e5fbdb28f1 | 50 | if (!fh) { |
WiredHome | 4:daf56708ae86 | 51 | lcd.PrintScreen(0,0,LCD_W,LCD_H,fqfn); |
WiredHome | 1:47e5fbdb28f1 | 52 | pc.printf(" as /local/Screen%02d.bmp\r\n", i); |
WiredHome | 1:47e5fbdb28f1 | 53 | return i; |
WiredHome | 1:47e5fbdb28f1 | 54 | } else { |
WiredHome | 1:47e5fbdb28f1 | 55 | fclose(fh); // close this and try the next |
WiredHome | 1:47e5fbdb28f1 | 56 | } |
WiredHome | 1:47e5fbdb28f1 | 57 | } |
WiredHome | 1:47e5fbdb28f1 | 58 | return 0; |
WiredHome | 1:47e5fbdb28f1 | 59 | } |
WiredHome | 1:47e5fbdb28f1 | 60 | |
WiredHome | 4:daf56708ae86 | 61 | const char * Bitstream(uint16_t value) |
WiredHome | 4:daf56708ae86 | 62 | { |
WiredHome | 4:daf56708ae86 | 63 | static char buffer[17]; |
WiredHome | 4:daf56708ae86 | 64 | char * p = buffer; |
WiredHome | 4:daf56708ae86 | 65 | uint16_t mask = 0x8000; |
WiredHome | 4:daf56708ae86 | 66 | |
WiredHome | 4:daf56708ae86 | 67 | do { |
WiredHome | 4:daf56708ae86 | 68 | *p++ = (value & mask) ? '1' : '0'; |
WiredHome | 4:daf56708ae86 | 69 | mask >>= 1; |
WiredHome | 4:daf56708ae86 | 70 | } while (mask); |
WiredHome | 4:daf56708ae86 | 71 | *p = '\0'; |
WiredHome | 4:daf56708ae86 | 72 | return buffer; |
WiredHome | 4:daf56708ae86 | 73 | } |
WiredHome | 4:daf56708ae86 | 74 | |
WiredHome | 4:daf56708ae86 | 75 | |
WiredHome | 4:daf56708ae86 | 76 | // Calibrate the resistive touch screen, and store the data on the |
WiredHome | 4:daf56708ae86 | 77 | // local file system. |
WiredHome | 4:daf56708ae86 | 78 | // |
WiredHome | 4:daf56708ae86 | 79 | void CalibrateTS(void) |
WiredHome | 0:2b1669e97586 | 80 | { |
WiredHome | 4:daf56708ae86 | 81 | FILE * fh; |
WiredHome | 4:daf56708ae86 | 82 | tpMatrix_t matrix; |
WiredHome | 4:daf56708ae86 | 83 | RetCode_t r; |
WiredHome | 4:daf56708ae86 | 84 | Timer testperiod; |
WiredHome | 4:daf56708ae86 | 85 | |
WiredHome | 4:daf56708ae86 | 86 | r = lcd.TouchPanelCalibrate("Calibrate the touch panel", &matrix); |
WiredHome | 4:daf56708ae86 | 87 | if (r == noerror) { |
WiredHome | 4:daf56708ae86 | 88 | fh = fopen("/local/tpcal.cfg", "wb"); |
WiredHome | 4:daf56708ae86 | 89 | if (fh) { |
WiredHome | 4:daf56708ae86 | 90 | fwrite(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 4:daf56708ae86 | 91 | fclose(fh); |
WiredHome | 4:daf56708ae86 | 92 | printf(" tp cal written.\r\n"); |
WiredHome | 4:daf56708ae86 | 93 | lcd.cls(); |
WiredHome | 4:daf56708ae86 | 94 | } else { |
WiredHome | 4:daf56708ae86 | 95 | printf(" couldn't open tpcal file.\r\n"); |
WiredHome | 4:daf56708ae86 | 96 | } |
WiredHome | 4:daf56708ae86 | 97 | } else { |
WiredHome | 4:daf56708ae86 | 98 | printf("error return: %d\r\n", r); |
WiredHome | 4:daf56708ae86 | 99 | } |
WiredHome | 4:daf56708ae86 | 100 | lcd.cls(); |
WiredHome | 4:daf56708ae86 | 101 | } |
WiredHome | 4:daf56708ae86 | 102 | |
WiredHome | 4:daf56708ae86 | 103 | // Try to load a previous resistive touch screen calibration from storage. If it |
WiredHome | 4:daf56708ae86 | 104 | // doesn't exist, activate the touch screen calibration process. |
WiredHome | 4:daf56708ae86 | 105 | // |
WiredHome | 4:daf56708ae86 | 106 | void InitTS(void) |
WiredHome | 4:daf56708ae86 | 107 | { |
WiredHome | 4:daf56708ae86 | 108 | FILE * fh; |
WiredHome | 4:daf56708ae86 | 109 | tpMatrix_t matrix; |
WiredHome | 4:daf56708ae86 | 110 | |
WiredHome | 4:daf56708ae86 | 111 | fh = fopen("/local/tpcal.cfg", "rb"); |
WiredHome | 4:daf56708ae86 | 112 | if (fh) { |
WiredHome | 4:daf56708ae86 | 113 | fread(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 4:daf56708ae86 | 114 | fclose(fh); |
WiredHome | 4:daf56708ae86 | 115 | lcd.TouchPanelSetMatrix(&matrix); |
WiredHome | 4:daf56708ae86 | 116 | printf(" tp cal loaded.\r\n"); |
WiredHome | 4:daf56708ae86 | 117 | } else { |
WiredHome | 4:daf56708ae86 | 118 | CalibrateTS(); |
WiredHome | 4:daf56708ae86 | 119 | } |
WiredHome | 4:daf56708ae86 | 120 | } |
WiredHome | 4:daf56708ae86 | 121 | |
WiredHome | 4:daf56708ae86 | 122 | |
WiredHome | 4:daf56708ae86 | 123 | int main() { |
WiredHome | 0:2b1669e97586 | 124 | pc.baud(460800); // I like a snappy terminal, so crank it up! |
WiredHome | 4:daf56708ae86 | 125 | pc.printf("\r\n%s Build %s\r\n", PROG_NAME, BUILD_DATE); |
WiredHome | 0:2b1669e97586 | 126 | |
WiredHome | 0:2b1669e97586 | 127 | pc.printf("Turning on display\r\n"); |
WiredHome | 4:daf56708ae86 | 128 | lcd.init(LCD_W,LCD_H,LCD_C); |
WiredHome | 4:daf56708ae86 | 129 | lcd.TouchPanelInit(); |
WiredHome | 4:daf56708ae86 | 130 | lcd.Backlight_u8(BL_NORM); |
WiredHome | 4:daf56708ae86 | 131 | |
WiredHome | 4:daf56708ae86 | 132 | #ifndef CAP_TOUCH |
WiredHome | 4:daf56708ae86 | 133 | InitTS(); // resistive touch calibration |
WiredHome | 4:daf56708ae86 | 134 | #endif |
WiredHome | 0:2b1669e97586 | 135 | lcd.cls(); |
WiredHome | 4:daf56708ae86 | 136 | |
WiredHome | 4:daf56708ae86 | 137 | lcd.printf("%s\r\nBuild %s", PROG_NAME, BUILD_DATE); |
WiredHome | 0:2b1669e97586 | 138 | |
WiredHome | 0:2b1669e97586 | 139 | // +----------------------------------------------------+ |
WiredHome | 4:daf56708ae86 | 140 | // | Prog Name [Capture] (x,y) (xxx,yyy) | |
WiredHome | 4:daf56708ae86 | 141 | // | Build Date [Capture] rgb (RR,GG,BB) | |
WiredHome | 0:2b1669e97586 | 142 | // | +------------------------------------------------+ | y = 50 |
WiredHome | 0:2b1669e97586 | 143 | // | | Sample Shown Here | | |
WiredHome | 0:2b1669e97586 | 144 | // | +------------------------------------------------+ | y = 89 |
WiredHome | 0:2b1669e97586 | 145 | // | Red 0 to 255 ------------------------------------+ | y = 100 |
WiredHome | 0:2b1669e97586 | 146 | // | | | | |
WiredHome | 0:2b1669e97586 | 147 | // | +------------------------------------------------+ | y = 139 |
WiredHome | 0:2b1669e97586 | 148 | // | Grn 0 to 255 ------------------------------------+ | y = 150 |
WiredHome | 0:2b1669e97586 | 149 | // | | | | |
WiredHome | 0:2b1669e97586 | 150 | // | +------------------------------------------------+ | y = 189 |
WiredHome | 0:2b1669e97586 | 151 | // | Blu 0 to 255 ------------------------------------+ | y = 200 |
WiredHome | 0:2b1669e97586 | 152 | // | | | | |
WiredHome | 0:2b1669e97586 | 153 | // | +------------------------------------------------+ | y = 239 |
WiredHome | 0:2b1669e97586 | 154 | // +----------------------------------------------------+ y = 271 |
WiredHome | 4:daf56708ae86 | 155 | // 10 w-10 |
WiredHome | 0:2b1669e97586 | 156 | rect_t RGBList[] = { |
WiredHome | 7:5194e00baf6f | 157 | { 10,100, LCD_W-10,139 }, // R |
WiredHome | 7:5194e00baf6f | 158 | { 10,150, LCD_W-10,189 }, // G |
WiredHome | 7:5194e00baf6f | 159 | { 10,200, LCD_W-10,239 }, // B |
WiredHome | 7:5194e00baf6f | 160 | { 10, 50, LCD_W-10, 89 } // This for the Sample |
WiredHome | 0:2b1669e97586 | 161 | }; |
WiredHome | 7:5194e00baf6f | 162 | rect_t PrintScreenRect = { LCD_W/2-30, 5, LCD_W/2+30, 40 }; |
WiredHome | 0:2b1669e97586 | 163 | lcd.fillrect(RGBList[0], Red); |
WiredHome | 0:2b1669e97586 | 164 | lcd.fillrect(RGBList[1], Green); |
WiredHome | 0:2b1669e97586 | 165 | lcd.fillrect(RGBList[2], Blue); |
WiredHome | 1:47e5fbdb28f1 | 166 | lcd.fillrect(PrintScreenRect, Gray); |
WiredHome | 1:47e5fbdb28f1 | 167 | lcd.foreground(Blue); |
WiredHome | 1:47e5fbdb28f1 | 168 | lcd.background(Gray); |
WiredHome | 4:daf56708ae86 | 169 | lcd.puts(LCD_W/2-28, 15, "Capture"); |
WiredHome | 1:47e5fbdb28f1 | 170 | lcd.background(Black); |
WiredHome | 0:2b1669e97586 | 171 | color_t rgb = Black; |
WiredHome | 0:2b1669e97586 | 172 | uint8_t rgbVal[3] = { 0, 0, 0 }; |
WiredHome | 0:2b1669e97586 | 173 | |
WiredHome | 0:2b1669e97586 | 174 | for (;;) { |
WiredHome | 0:2b1669e97586 | 175 | point_t p; |
WiredHome | 0:2b1669e97586 | 176 | |
WiredHome | 0:2b1669e97586 | 177 | if (lcd.TouchPanelReadable(&p)) { |
WiredHome | 0:2b1669e97586 | 178 | lcd.foreground(Blue); |
WiredHome | 4:daf56708ae86 | 179 | lcd.SetTextCursor(LCD_W-72, 0); |
WiredHome | 0:2b1669e97586 | 180 | lcd.printf("(%3d,%3d)", p.x, p.y); |
WiredHome | 0:2b1669e97586 | 181 | |
WiredHome | 4:daf56708ae86 | 182 | if (lcd.Intersect(PrintScreenRect, p)) { |
WiredHome | 1:47e5fbdb28f1 | 183 | GetScreenCapture(); |
WiredHome | 1:47e5fbdb28f1 | 184 | } |
WiredHome | 0:2b1669e97586 | 185 | for (int i=0; i<3; i++) { |
WiredHome | 4:daf56708ae86 | 186 | if (lcd.Intersect(RGBList[i], p)) { |
WiredHome | 4:daf56708ae86 | 187 | uint8_t mag = (255 * (float)(p.x - RGBList[i].p1.x)) / (float)(RGBList[i].p2.x - RGBList[i].p1.x); |
WiredHome | 0:2b1669e97586 | 188 | rgbVal[i] = mag; |
WiredHome | 4:daf56708ae86 | 189 | lcd.SetTextCursor(LCD_W-80, 16); |
WiredHome | 0:2b1669e97586 | 190 | lcd.foreground(Blue); |
WiredHome | 0:2b1669e97586 | 191 | lcd.printf("(%02X,%02X,%02X)", rgbVal[0], rgbVal[1], rgbVal[2]); |
WiredHome | 0:2b1669e97586 | 192 | rgb = RGB(rgbVal[0], rgbVal[1], rgbVal[2]); |
WiredHome | 4:daf56708ae86 | 193 | pc.printf("RGB: %04X %s\r\n", rgb, Bitstream(rgb)); |
WiredHome | 0:2b1669e97586 | 194 | lcd.fillrect(RGBList[3], rgb); |
WiredHome | 0:2b1669e97586 | 195 | break; |
WiredHome | 0:2b1669e97586 | 196 | } |
WiredHome | 0:2b1669e97586 | 197 | } |
WiredHome | 0:2b1669e97586 | 198 | } |
WiredHome | 0:2b1669e97586 | 199 | } |
WiredHome | 0:2b1669e97586 | 200 | } |