An example program using the RA8875 Display controller with the touch-screen option.

Dependencies:   RA8875

Committer:
WiredHome
Date:
Sun Jul 28 03:44:00 2019 +0000
Revision:
6:813c99fda5da
Parent:
4:daf56708ae86
Child:
7:5194e00baf6f
update RA lib

Who changed what in which revision?

UserRevisionLine numberNew 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 6:813c99fda5da 157 rect_t( 10,100, LCD_W-10,139 ), // R
WiredHome 6:813c99fda5da 158 rect_t( 10,150, LCD_W-10,189 ), // G
WiredHome 6:813c99fda5da 159 rect_t( 10,200, LCD_W-10,239 ), // B
WiredHome 6:813c99fda5da 160 rect_t( 10, 50, LCD_W-10, 89 ) // This for the Sample
WiredHome 0:2b1669e97586 161 };
WiredHome 6:813c99fda5da 162 rect_t PrintScreenRect = rect_t( 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 }