Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.

Offline Help Manual (Windows chm)

/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)

Committer:
WiredHome
Date:
Sun Dec 28 19:55:16 2014 +0000
Revision:
79:544eb4964795
Parent:
78:faf49c381591
Child:
80:cc4fab58179c
cleaned up touch screen support, which included renaming the APIs to better reflect their purpose.; remove dead code, added documentation for methods that were missing it.; major refactor to the constructor, to move needed code to init().

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 19:3f82c1161fd2 1 /// RA8875 Display Controller Library.
WiredHome 73:f22a18707b5e 2 ///
WiredHome 68:ab08efabfc88 3 /// This is being created for a Raio RA8875-based display from buydisplay.com,
WiredHome 73:f22a18707b5e 4 /// which is 480 x 272 using a 4-wire SPI interface.
WiredHome 68:ab08efabfc88 5 /// This display controller is used in other display resolutions, up to 800x600.
WiredHome 68:ab08efabfc88 6 /// While this driver has not been tested with these variants, nothing was done
WiredHome 68:ab08efabfc88 7 /// to prevent easily supporting them.
WiredHome 19:3f82c1161fd2 8 ///
WiredHome 19:3f82c1161fd2 9 #include "RA8875.h"
WiredHome 19:3f82c1161fd2 10
WiredHome 41:2956a0a221e5 11 //#define DEBUG "RAIO"
WiredHome 19:3f82c1161fd2 12 // ...
WiredHome 19:3f82c1161fd2 13 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 19:3f82c1161fd2 14 //
WiredHome 19:3f82c1161fd2 15 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 19:3f82c1161fd2 16 #define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 17 #define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 18 #define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 73:f22a18707b5e 19 static void HexDump(char * title, uint8_t * p, int count)
WiredHome 73:f22a18707b5e 20 {
WiredHome 73:f22a18707b5e 21 int i;
WiredHome 73:f22a18707b5e 22 char buf[100] = "0000: ";
WiredHome 73:f22a18707b5e 23
WiredHome 73:f22a18707b5e 24 if (*title)
WiredHome 73:f22a18707b5e 25 INFO("%s", title);
WiredHome 73:f22a18707b5e 26 for (i=0; i<count; ) {
WiredHome 73:f22a18707b5e 27 sprintf(buf + strlen(buf), "%02X ", *(p+i));
WiredHome 73:f22a18707b5e 28 if ((++i & 0x0F) == 0x00) {
WiredHome 73:f22a18707b5e 29 INFO("%s", buf);
WiredHome 73:f22a18707b5e 30 if (i < count)
WiredHome 73:f22a18707b5e 31 sprintf(buf, "%04X: ", i);
WiredHome 73:f22a18707b5e 32 else
WiredHome 73:f22a18707b5e 33 buf[0] = '\0';
WiredHome 73:f22a18707b5e 34 }
WiredHome 73:f22a18707b5e 35 }
WiredHome 73:f22a18707b5e 36 if (strlen(buf))
WiredHome 73:f22a18707b5e 37 INFO("%s", buf);
WiredHome 73:f22a18707b5e 38 }
WiredHome 19:3f82c1161fd2 39 #else
WiredHome 19:3f82c1161fd2 40 #define INFO(x, ...)
WiredHome 19:3f82c1161fd2 41 #define WARN(x, ...)
WiredHome 19:3f82c1161fd2 42 #define ERR(x, ...)
WiredHome 73:f22a18707b5e 43 #define HexDump(a, b, c)
WiredHome 19:3f82c1161fd2 44 #endif
WiredHome 19:3f82c1161fd2 45
WiredHome 19:3f82c1161fd2 46
WiredHome 19:3f82c1161fd2 47 #define RA8875_DISPLAY_WIDTH 480
WiredHome 19:3f82c1161fd2 48 #define RA8875_DISPLAY_HEIGHT 272
WiredHome 43:3becae133285 49 #define RA8875_COLORDEPTH_BPP 16 /* Not an API */
WiredHome 19:3f82c1161fd2 50
WiredHome 19:3f82c1161fd2 51 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 52 #define PERFORMANCE_RESET performance.reset()
WiredHome 19:3f82c1161fd2 53 #define REGISTERPERFORMANCE(a) RegisterPerformance(a)
WiredHome 68:ab08efabfc88 54 #define COUNTIDLETIME(a) CountIdleTime(a)
WiredHome 73:f22a18707b5e 55 static const char *metricsName[] = {
WiredHome 73:f22a18707b5e 56 "Cls", "Pixel", "Pixel Stream",
WiredHome 41:2956a0a221e5 57 "Read Pixel", "Read Pixel Stream",
WiredHome 73:f22a18707b5e 58 "Line",
WiredHome 73:f22a18707b5e 59 "Rectangle", "Rounded Rectangle",
WiredHome 68:ab08efabfc88 60 "Triangle", "Circle", "Ellipse"
WiredHome 19:3f82c1161fd2 61 };
WiredHome 19:3f82c1161fd2 62 #else
WiredHome 19:3f82c1161fd2 63 #define PERFORMANCE_RESET
WiredHome 19:3f82c1161fd2 64 #define REGISTERPERFORMANCE(a)
WiredHome 68:ab08efabfc88 65 #define COUNTIDLETIME(a)
WiredHome 19:3f82c1161fd2 66 #endif
WiredHome 19:3f82c1161fd2 67
WiredHome 73:f22a18707b5e 68 // When it is going to poll a register for completion, how many
WiredHome 19:3f82c1161fd2 69 // uSec should it wait between each polling activity.
WiredHome 19:3f82c1161fd2 70 #define POLLWAITuSec 10
WiredHome 19:3f82c1161fd2 71
WiredHome 75:ca78388cfd77 72 // Private RawKeyMap for the Keyboard interface
WiredHome 79:544eb4964795 73 static const uint8_t DefaultKeyMap[22] = {
WiredHome 77:9206c13aa527 74 0,
WiredHome 77:9206c13aa527 75 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
WiredHome 75:ca78388cfd77 76 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
WiredHome 75:ca78388cfd77 77 255
WiredHome 77:9206c13aa527 78 };
WiredHome 75:ca78388cfd77 79
WiredHome 79:544eb4964795 80 static const char * ErrMessages[] = {
WiredHome 79:544eb4964795 81 "noerror", ///< no errors, command completed successfully
WiredHome 79:544eb4964795 82 "bad_parameter", ///< one or more parameters are invalid
WiredHome 79:544eb4964795 83 "file_not_found", ///< specified file could not be found
WiredHome 79:544eb4964795 84 "not_bmp_format", ///< file is not a .bmp file
WiredHome 79:544eb4964795 85 "not_ico_format", ///< file is not a .ico file
WiredHome 79:544eb4964795 86 "not_supported_format", ///< file format is not yet supported
WiredHome 79:544eb4964795 87 "image_too_big", ///< image is too large for the screen
WiredHome 79:544eb4964795 88 "not_enough_ram", ///< could not allocate ram for scanline
WiredHome 79:544eb4964795 89 };
WiredHome 19:3f82c1161fd2 90
WiredHome 19:3f82c1161fd2 91 RA8875::RA8875(PinName mosi, PinName miso, PinName sclk, PinName csel, PinName reset, const char *name)
WiredHome 58:26658a56112a 92 : GraphicsDisplay(name)
WiredHome 58:26658a56112a 93 , spi(mosi, miso, sclk)
WiredHome 19:3f82c1161fd2 94 , cs(csel)
WiredHome 19:3f82c1161fd2 95 , res(reset)
WiredHome 19:3f82c1161fd2 96 {
WiredHome 19:3f82c1161fd2 97 }
WiredHome 19:3f82c1161fd2 98
WiredHome 19:3f82c1161fd2 99 //RA8875::~RA8875()
WiredHome 19:3f82c1161fd2 100 //{
WiredHome 19:3f82c1161fd2 101 //}
WiredHome 19:3f82c1161fd2 102
WiredHome 79:544eb4964795 103 RetCode_t RA8875::init(bool poweron, int width, int height, int color_bpp)
WiredHome 79:544eb4964795 104 {
WiredHome 79:544eb4964795 105 INFO("init(%d,%d,%d,%d)", poweron, width, height, color_bpp);
WiredHome 79:544eb4964795 106 font = NULL; // no external font, use internal.
WiredHome 79:544eb4964795 107 pKeyMap = DefaultKeyMap; // set default key map
WiredHome 79:544eb4964795 108 _select(false); // deselect the display
WiredHome 79:544eb4964795 109 frequency(RA8875_DEFAULT_SPI_FREQ); // data rate
WiredHome 79:544eb4964795 110 Reset();
WiredHome 79:544eb4964795 111 WriteCommand(0x88, 0x0B); // PLLC1 - Phase Lock Loop registers
WiredHome 79:544eb4964795 112 wait_ms(1);
WiredHome 79:544eb4964795 113 WriteCommand(0x89, 0x02);
WiredHome 79:544eb4964795 114 wait_ms(1);
WiredHome 79:544eb4964795 115
WiredHome 79:544eb4964795 116 // System Config Register (SYSR)
WiredHome 79:544eb4964795 117 if (color_bpp == 16) {
WiredHome 79:544eb4964795 118 WriteCommand(0x10, 0x0C); // 16-bpp (65K colors) color depth, 8-bit interface
WiredHome 79:544eb4964795 119 } else { // color_bpp == 8
WiredHome 79:544eb4964795 120 WriteCommand(0x10, 0x00); // 8-bpp (256 colors)
WiredHome 79:544eb4964795 121 }
WiredHome 79:544eb4964795 122 // Pixel Clock Setting Register (PCSR)
WiredHome 79:544eb4964795 123 WriteCommand(0x04, 0x82); // PDAT on PCLK falling edge, PCLK = 4 x System Clock
WiredHome 79:544eb4964795 124 wait_ms(1);
WiredHome 79:544eb4964795 125
WiredHome 79:544eb4964795 126 // Horizontal Settings
WiredHome 79:544eb4964795 127 WriteCommand(0x14, width/8 - 1); //HDWR//Horizontal Display Width Setting Bit[6:0]
WiredHome 79:544eb4964795 128 WriteCommand(0x15, 0x02); //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0]
WiredHome 79:544eb4964795 129 WriteCommand(0x16, 0x03); //HNDR//Horizontal Non-Display Period Bit[4:0]
WiredHome 79:544eb4964795 130 WriteCommand(0x17, 0x01); //HSTR//HSYNC Start Position[4:0]
WiredHome 79:544eb4964795 131 WriteCommand(0x18, 0x03); //HPWR//HSYNC Polarity ,The period width of HSYNC.
WiredHome 79:544eb4964795 132
WiredHome 79:544eb4964795 133 // Vertical Settings
WiredHome 79:544eb4964795 134 WriteCommand(0x19, (height-1)&0xFF); //VDHR0 //Vertical Display Height Bit [7:0]
WiredHome 79:544eb4964795 135 WriteCommand(0x1a, (height-1)>>8); //VDHR1 //Vertical Display Height Bit [8]
WiredHome 79:544eb4964795 136 WriteCommand(0x1b, 0x0F); //VNDR0 //Vertical Non-Display Period Bit [7:0]
WiredHome 79:544eb4964795 137 WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8]
WiredHome 79:544eb4964795 138 WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0]
WiredHome 79:544eb4964795 139 WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8]
WiredHome 79:544eb4964795 140 WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
WiredHome 79:544eb4964795 141
WiredHome 79:544eb4964795 142 if (width >= 800 && height >= 480 && color_bpp > 8) {
WiredHome 79:544eb4964795 143 WriteCommand(0x20, 0x00); // DPCR - 1-layer mode when the resolution is too high
WiredHome 79:544eb4964795 144 } else {
WiredHome 79:544eb4964795 145 WriteCommand(0x20, 0x80); // DPCR - 2-layer mode
WiredHome 79:544eb4964795 146 }
WiredHome 79:544eb4964795 147
WiredHome 79:544eb4964795 148 // Set display image to Blue on Black as default
WiredHome 79:544eb4964795 149 window(0,0, width, height); // Initialize to full screen
WiredHome 79:544eb4964795 150 SetTextCursorControl();
WiredHome 79:544eb4964795 151 foreground(Blue);
WiredHome 79:544eb4964795 152 background(Black);
WiredHome 79:544eb4964795 153 cls(3);
WiredHome 79:544eb4964795 154
WiredHome 79:544eb4964795 155 Power(poweron);
WiredHome 79:544eb4964795 156 if (poweron)
WiredHome 79:544eb4964795 157 Backlight_u8(255);
WiredHome 79:544eb4964795 158 #ifdef PERF_METRICS
WiredHome 79:544eb4964795 159 performance.start();
WiredHome 79:544eb4964795 160 ClearPerformance();
WiredHome 79:544eb4964795 161 #endif
WiredHome 79:544eb4964795 162 return noerror;
WiredHome 79:544eb4964795 163 }
WiredHome 79:544eb4964795 164
WiredHome 79:544eb4964795 165
WiredHome 79:544eb4964795 166 RetCode_t RA8875::Reset(void)
WiredHome 79:544eb4964795 167 {
WiredHome 79:544eb4964795 168 RetCode_t ret;
WiredHome 79:544eb4964795 169
WiredHome 79:544eb4964795 170 ret = WriteCommand(0x01, 0x01); // Apply Display Off, Reset
WiredHome 79:544eb4964795 171 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 79:544eb4964795 172 if (ret == noerror) {
WiredHome 79:544eb4964795 173 ret = WriteCommand(0x01, 0x00); // Display off, Remove reset
WiredHome 79:544eb4964795 174 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 79:544eb4964795 175 }
WiredHome 79:544eb4964795 176 return ret;
WiredHome 79:544eb4964795 177 }
WiredHome 79:544eb4964795 178
WiredHome 79:544eb4964795 179
WiredHome 79:544eb4964795 180 const char * RA8875::GetErrorMessage(RetCode_t code)
WiredHome 79:544eb4964795 181 {
WiredHome 79:544eb4964795 182 if (code >= LastErrCode)
WiredHome 79:544eb4964795 183 code = bad_parameter;
WiredHome 79:544eb4964795 184 return ErrMessages[code];
WiredHome 79:544eb4964795 185 }
WiredHome 79:544eb4964795 186
WiredHome 79:544eb4964795 187
WiredHome 61:8f3153bf0baa 188 uint16_t RA8875::GetDrawingLayer(void)
WiredHome 61:8f3153bf0baa 189 {
WiredHome 61:8f3153bf0baa 190 return (ReadCommand(0x41) & 0x01);
WiredHome 61:8f3153bf0baa 191 }
WiredHome 43:3becae133285 192
WiredHome 79:544eb4964795 193
WiredHome 50:2c4f474a2453 194 RetCode_t RA8875::SelectDrawingLayer(uint16_t layer)
WiredHome 43:3becae133285 195 {
WiredHome 43:3becae133285 196 unsigned char mwcr1 = ReadCommand(0x41) & ~0x01; // retain all but the currently selected layer
WiredHome 43:3becae133285 197
WiredHome 43:3becae133285 198 if (width() >= 800 && height() >= 480 && color_bpp() == 8) {
WiredHome 43:3becae133285 199 return bad_parameter;
WiredHome 43:3becae133285 200 } else if (layer > 1) {
WiredHome 43:3becae133285 201 return bad_parameter;
WiredHome 43:3becae133285 202 } else { // layer == 0 ro 1
WiredHome 72:ecffe56af969 203 return WriteCommand(0x41, mwcr1 | layer);
WiredHome 43:3becae133285 204 }
WiredHome 43:3becae133285 205 }
WiredHome 43:3becae133285 206
WiredHome 44:207594dece70 207
WiredHome 53:86d24b9480b9 208 RetCode_t RA8875::SetLayerMode(LayerMode_T mode)
WiredHome 44:207594dece70 209 {
WiredHome 53:86d24b9480b9 210 unsigned char ltpr0 = ReadCommand(0x52) & ~0x7; // retain all but the display layer mode
WiredHome 53:86d24b9480b9 211 if (mode <= (LayerMode_T)6) {
WiredHome 53:86d24b9480b9 212 WriteCommand(0x52, ltpr0 | (mode & 0x7));
WiredHome 53:86d24b9480b9 213 return noerror;
WiredHome 53:86d24b9480b9 214 } else {
WiredHome 53:86d24b9480b9 215 return bad_parameter;
WiredHome 53:86d24b9480b9 216 }
WiredHome 44:207594dece70 217 }
WiredHome 44:207594dece70 218
WiredHome 44:207594dece70 219
WiredHome 44:207594dece70 220 RetCode_t RA8875::SetLayerTransparency(uint8_t layer1, uint8_t layer2)
WiredHome 44:207594dece70 221 {
WiredHome 44:207594dece70 222 if (layer1 > 8)
WiredHome 44:207594dece70 223 layer1 = 8;
WiredHome 44:207594dece70 224 if (layer2 > 8)
WiredHome 44:207594dece70 225 layer2 = 8;
WiredHome 44:207594dece70 226 WriteCommand(0x53, ((layer2 & 0xF) << 4) | (layer1 & 0xF));
WiredHome 44:207594dece70 227 return noerror;
WiredHome 44:207594dece70 228 }
WiredHome 44:207594dece70 229
WiredHome 44:207594dece70 230
WiredHome 53:86d24b9480b9 231 RetCode_t RA8875::SetBackgroundTransparencyColor(color_t color)
WiredHome 53:86d24b9480b9 232 {
WiredHome 53:86d24b9480b9 233 WriteCommand(0x67, (color >> 11) & 0x1F);
WiredHome 53:86d24b9480b9 234 WriteCommand(0x68, (color >> 5) & 0x3F);
WiredHome 53:86d24b9480b9 235 WriteCommand(0x69, (color & 0x1F));
WiredHome 53:86d24b9480b9 236 return noerror;
WiredHome 53:86d24b9480b9 237 }
WiredHome 53:86d24b9480b9 238
WiredHome 79:544eb4964795 239
WiredHome 73:f22a18707b5e 240 color_t RA8875::GetBackgroundTransparencyColor(void)
WiredHome 73:f22a18707b5e 241 {
WiredHome 73:f22a18707b5e 242 RGBQUAD q;
WiredHome 73:f22a18707b5e 243 q.rgbRed = ReadCommand(0x67);
WiredHome 73:f22a18707b5e 244 q.rgbGreen = ReadCommand(0x68);
WiredHome 73:f22a18707b5e 245 q.rgbBlue = ReadCommand(0x69);
WiredHome 73:f22a18707b5e 246 return RGBQuadToRGB16(&q, 0);
WiredHome 73:f22a18707b5e 247 }
WiredHome 73:f22a18707b5e 248
WiredHome 71:dcac8efd842d 249
WiredHome 77:9206c13aa527 250 RetCode_t RA8875::KeypadInit(bool scanEnable, bool longDetect, uint8_t sampleTime, uint8_t scanFrequency,
WiredHome 77:9206c13aa527 251 uint8_t longTimeAdjustment, bool interruptEnable, bool wakeupEnable)
WiredHome 71:dcac8efd842d 252 {
WiredHome 71:dcac8efd842d 253 uint8_t value = 0;
WiredHome 77:9206c13aa527 254
WiredHome 71:dcac8efd842d 255 if (sampleTime > 3 || scanFrequency > 7 || longTimeAdjustment > 3)
WiredHome 71:dcac8efd842d 256 return bad_parameter;
WiredHome 71:dcac8efd842d 257 value |= (scanEnable) ? 0x80 : 0x00;
WiredHome 71:dcac8efd842d 258 value |= (longDetect) ? 0x40 : 0x00;
WiredHome 71:dcac8efd842d 259 value |= (sampleTime & 0x03) << 4;
WiredHome 71:dcac8efd842d 260 value |= (scanFrequency & 0x07);
WiredHome 75:ca78388cfd77 261 WriteCommand(0xC0, value); // KSCR1 - Enable Key Scan (and ignore possibility of an error)
WiredHome 77:9206c13aa527 262
WiredHome 71:dcac8efd842d 263 value = 0;
WiredHome 71:dcac8efd842d 264 value |= (wakeupEnable) ? 0x80 : 0x00;
WiredHome 71:dcac8efd842d 265 value |= (longTimeAdjustment & 0x03) << 2;
WiredHome 75:ca78388cfd77 266 WriteCommand(0xC1, value); // KSCR2 - (and ignore possibility of an error)
WiredHome 77:9206c13aa527 267
WiredHome 75:ca78388cfd77 268 value = ReadCommand(0xF0); // (and ignore possibility of an error)
WiredHome 71:dcac8efd842d 269 value &= ~0x10;
WiredHome 71:dcac8efd842d 270 value |= (interruptEnable) ? 0x10 : 0x00;
WiredHome 75:ca78388cfd77 271 return WriteCommand(0xF0, value); // INT
WiredHome 71:dcac8efd842d 272 }
WiredHome 71:dcac8efd842d 273
WiredHome 79:544eb4964795 274
WiredHome 75:ca78388cfd77 275 RetCode_t RA8875::SetKeyMap(const uint8_t * CodeList)
WiredHome 75:ca78388cfd77 276 {
WiredHome 75:ca78388cfd77 277 pKeyMap = CodeList;
WiredHome 75:ca78388cfd77 278 return noerror;
WiredHome 75:ca78388cfd77 279 }
WiredHome 75:ca78388cfd77 280
WiredHome 79:544eb4964795 281
WiredHome 75:ca78388cfd77 282 bool RA8875::readable(void)
WiredHome 71:dcac8efd842d 283 {
WiredHome 71:dcac8efd842d 284 return (ReadCommand(0xF1) & 0x10); // check KS status - true if kbhit
WiredHome 71:dcac8efd842d 285 }
WiredHome 71:dcac8efd842d 286
WiredHome 79:544eb4964795 287
WiredHome 75:ca78388cfd77 288 uint8_t RA8875::getc(void)
WiredHome 71:dcac8efd842d 289 {
WiredHome 79:544eb4964795 290 //#define GETC_DEV // for development
WiredHome 77:9206c13aa527 291 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 292 uint8_t keyCode1, keyCode2;
WiredHome 77:9206c13aa527 293 #endif
WiredHome 75:ca78388cfd77 294 uint8_t keyCode3;
WiredHome 75:ca78388cfd77 295 static uint8_t count = 0;
WiredHome 75:ca78388cfd77 296 uint8_t col, row;
WiredHome 75:ca78388cfd77 297 uint8_t key;
WiredHome 77:9206c13aa527 298
WiredHome 75:ca78388cfd77 299 while (!readable()) {
WiredHome 71:dcac8efd842d 300 wait_us(POLLWAITuSec);
WiredHome 75:ca78388cfd77 301 // COUNTIDLETIME(POLLWAITuSec); // As it is voluntary to call the getc and pend. Don't tally it.
WiredHome 71:dcac8efd842d 302 }
WiredHome 71:dcac8efd842d 303 // read the key press number
WiredHome 71:dcac8efd842d 304 uint8_t keyNumReg = ReadCommand(0xC1) & 0x03;
WiredHome 75:ca78388cfd77 305 count++;
WiredHome 75:ca78388cfd77 306 switch (keyNumReg) {
WiredHome 75:ca78388cfd77 307 case 0x01: // one key
WiredHome 75:ca78388cfd77 308 keyCode3 = ReadCommand(0xC2);
WiredHome 77:9206c13aa527 309 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 310 keyCode2 = 0;
WiredHome 75:ca78388cfd77 311 keyCode1 = 0;
WiredHome 77:9206c13aa527 312 #endif
WiredHome 75:ca78388cfd77 313 break;
WiredHome 75:ca78388cfd77 314 case 0x02: // two keys
WiredHome 75:ca78388cfd77 315 keyCode3 = ReadCommand(0xC3);
WiredHome 77:9206c13aa527 316 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 317 keyCode2 = ReadCommand(0xC2);
WiredHome 75:ca78388cfd77 318 keyCode1 = 0;
WiredHome 77:9206c13aa527 319 #endif
WiredHome 75:ca78388cfd77 320 break;
WiredHome 75:ca78388cfd77 321 case 0x03: // three keys
WiredHome 75:ca78388cfd77 322 keyCode3 = ReadCommand(0xC4);
WiredHome 77:9206c13aa527 323 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 324 keyCode2 = ReadCommand(0xC3);
WiredHome 75:ca78388cfd77 325 keyCode1 = ReadCommand(0xC2);
WiredHome 77:9206c13aa527 326 #endif
WiredHome 75:ca78388cfd77 327 break;
WiredHome 75:ca78388cfd77 328 default: // no keys (key released)
WiredHome 75:ca78388cfd77 329 keyCode3 = 0xFF;
WiredHome 77:9206c13aa527 330 #ifdef GETC_DEV
WiredHome 75:ca78388cfd77 331 keyCode2 = 0;
WiredHome 75:ca78388cfd77 332 keyCode1 = 0;
WiredHome 77:9206c13aa527 333 #endif
WiredHome 75:ca78388cfd77 334 break;
WiredHome 75:ca78388cfd77 335 }
WiredHome 75:ca78388cfd77 336 if (keyCode3 == 0xFF)
WiredHome 75:ca78388cfd77 337 key = pKeyMap[0]; // Key value 0
WiredHome 75:ca78388cfd77 338 else {
WiredHome 75:ca78388cfd77 339 row = (keyCode3 >> 4) & 0x03;
WiredHome 75:ca78388cfd77 340 col = (keyCode3 & 7);
WiredHome 75:ca78388cfd77 341 key = row * 5 + col + 1; // Keys value 1 - 20
WiredHome 75:ca78388cfd77 342 if (key > 21) {
WiredHome 75:ca78388cfd77 343 key = 21;
WiredHome 75:ca78388cfd77 344 }
WiredHome 75:ca78388cfd77 345 key = pKeyMap[key];
WiredHome 75:ca78388cfd77 346 key |= (keyCode3 & 0x80); // combine the key held flag
WiredHome 75:ca78388cfd77 347 }
WiredHome 77:9206c13aa527 348 #if GETC_DEV // for Development only
WiredHome 75:ca78388cfd77 349 SetTextCursor(0, 20);
WiredHome 75:ca78388cfd77 350 printf(" Reg: %02x\r\n", keyNumReg);
WiredHome 75:ca78388cfd77 351 printf(" key1: %02x\r\n", keyCode1);
WiredHome 75:ca78388cfd77 352 printf(" key2: %02x\r\n", keyCode2);
WiredHome 75:ca78388cfd77 353 printf(" key3: %02x\r\n", keyCode3);
WiredHome 75:ca78388cfd77 354 printf(" count: %02X\r\n", count);
WiredHome 75:ca78388cfd77 355 printf(" key: %02X\r\n", key);
WiredHome 77:9206c13aa527 356 #endif
WiredHome 75:ca78388cfd77 357 WriteCommand(0xF1, 0x10); // Clear KS status
WiredHome 75:ca78388cfd77 358 return key;
WiredHome 71:dcac8efd842d 359 }
WiredHome 71:dcac8efd842d 360
WiredHome 79:544eb4964795 361
WiredHome 19:3f82c1161fd2 362 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 363 void RA8875::ClearPerformance()
WiredHome 19:3f82c1161fd2 364 {
WiredHome 19:3f82c1161fd2 365 for (int i=0; i<METRICCOUNT; i++)
WiredHome 19:3f82c1161fd2 366 metrics[i] = 0;
WiredHome 75:ca78388cfd77 367 idletime_usec = 0;
WiredHome 19:3f82c1161fd2 368 }
WiredHome 19:3f82c1161fd2 369
WiredHome 79:544eb4964795 370
WiredHome 19:3f82c1161fd2 371 void RA8875::RegisterPerformance(method_e method)
WiredHome 19:3f82c1161fd2 372 {
WiredHome 19:3f82c1161fd2 373 unsigned long elapsed = performance.read_us();
WiredHome 73:f22a18707b5e 374
WiredHome 19:3f82c1161fd2 375 if (method < METRICCOUNT && elapsed > metrics[method])
WiredHome 19:3f82c1161fd2 376 metrics[method] = elapsed;
WiredHome 19:3f82c1161fd2 377 }
WiredHome 19:3f82c1161fd2 378
WiredHome 79:544eb4964795 379
WiredHome 66:468a11f05580 380 void RA8875::CountIdleTime(uint32_t t)
WiredHome 66:468a11f05580 381 {
WiredHome 75:ca78388cfd77 382 idletime_usec += t;
WiredHome 66:468a11f05580 383 }
WiredHome 44:207594dece70 384
WiredHome 79:544eb4964795 385
WiredHome 41:2956a0a221e5 386 void RA8875::ReportPerformance(Serial & pc)
WiredHome 19:3f82c1161fd2 387 {
WiredHome 41:2956a0a221e5 388 pc.printf("\r\nPerformance Metrics\r\n");
WiredHome 19:3f82c1161fd2 389 for (int i=0; i<METRICCOUNT; i++) {
WiredHome 41:2956a0a221e5 390 pc.printf("%10d uS %s\r\n", metrics[i], metricsName[i]);
WiredHome 66:468a11f05580 391 }
WiredHome 75:ca78388cfd77 392 pc.printf("%10d uS Idle time polling display for ready.\r\n", idletime_usec);
WiredHome 19:3f82c1161fd2 393 }
WiredHome 19:3f82c1161fd2 394 #endif
WiredHome 19:3f82c1161fd2 395
WiredHome 44:207594dece70 396
WiredHome 38:38d503b4fad6 397 RetCode_t RA8875::WriteCommandW(uint8_t command, uint16_t data)
WiredHome 38:38d503b4fad6 398 {
WiredHome 73:f22a18707b5e 399 #if 1
WiredHome 38:38d503b4fad6 400 WriteCommand(command, data & 0xFF);
WiredHome 38:38d503b4fad6 401 WriteCommand(command+1, data >> 8);
WiredHome 73:f22a18707b5e 402 #else
WiredHome 41:2956a0a221e5 403 // This should be a little faster, but doesn't work...
WiredHome 38:38d503b4fad6 404 INFO("WriteCommandW(%02X, %04X)", command, data);
WiredHome 79:544eb4964795 405 _select(true);
WiredHome 79:544eb4964795 406 _spiwrite(0x80);
WiredHome 79:544eb4964795 407 _spiwrite(command);
WiredHome 79:544eb4964795 408 //_spiwrite(0x00); // dummy
WiredHome 79:544eb4964795 409 _spiwrite(data & 0xFF);
WiredHome 79:544eb4964795 410 _spiwrite(data >> 8);
WiredHome 79:544eb4964795 411 _select(false);
WiredHome 73:f22a18707b5e 412 #endif
WiredHome 38:38d503b4fad6 413 return noerror;
WiredHome 38:38d503b4fad6 414 }
WiredHome 38:38d503b4fad6 415
WiredHome 44:207594dece70 416
WiredHome 19:3f82c1161fd2 417 RetCode_t RA8875::WriteCommand(unsigned char command, unsigned int data)
WiredHome 19:3f82c1161fd2 418 {
WiredHome 79:544eb4964795 419 _select(true);
WiredHome 79:544eb4964795 420 _spiwrite(0x80); // cmd: write command
WiredHome 79:544eb4964795 421 _spiwrite(command);
WiredHome 19:3f82c1161fd2 422 if (data <= 0xFF) { // only if in the valid range
WiredHome 79:544eb4964795 423 _spiwrite(0x00);
WiredHome 79:544eb4964795 424 _spiwrite(data);
WiredHome 19:3f82c1161fd2 425 }
WiredHome 79:544eb4964795 426 _select(false);
WiredHome 19:3f82c1161fd2 427 return noerror;
WiredHome 19:3f82c1161fd2 428 }
WiredHome 19:3f82c1161fd2 429
WiredHome 44:207594dece70 430
WiredHome 38:38d503b4fad6 431 RetCode_t RA8875::WriteDataW(uint16_t data)
WiredHome 38:38d503b4fad6 432 {
WiredHome 79:544eb4964795 433 _select(true);
WiredHome 79:544eb4964795 434 _spiwrite(0x00); // cmd: write data
WiredHome 79:544eb4964795 435 _spiwrite(data & 0xFF);
WiredHome 79:544eb4964795 436 _spiwrite(data >> 8);
WiredHome 79:544eb4964795 437 _select(false);
WiredHome 38:38d503b4fad6 438 return noerror;
WiredHome 38:38d503b4fad6 439 }
WiredHome 38:38d503b4fad6 440
WiredHome 44:207594dece70 441
WiredHome 19:3f82c1161fd2 442 RetCode_t RA8875::WriteData(unsigned char data)
WiredHome 19:3f82c1161fd2 443 {
WiredHome 79:544eb4964795 444 _select(true);
WiredHome 79:544eb4964795 445 _spiwrite(0x00);
WiredHome 79:544eb4964795 446 _spiwrite(data);
WiredHome 79:544eb4964795 447 _select(false);
WiredHome 19:3f82c1161fd2 448 return noerror;
WiredHome 19:3f82c1161fd2 449 }
WiredHome 19:3f82c1161fd2 450
WiredHome 44:207594dece70 451
WiredHome 19:3f82c1161fd2 452 unsigned char RA8875::ReadCommand(unsigned char command)
WiredHome 19:3f82c1161fd2 453 {
WiredHome 19:3f82c1161fd2 454 WriteCommand(command);
WiredHome 19:3f82c1161fd2 455 return ReadData();
WiredHome 19:3f82c1161fd2 456 }
WiredHome 19:3f82c1161fd2 457
WiredHome 44:207594dece70 458
WiredHome 19:3f82c1161fd2 459 unsigned char RA8875::ReadData(void)
WiredHome 19:3f82c1161fd2 460 {
WiredHome 19:3f82c1161fd2 461 unsigned char data;
WiredHome 73:f22a18707b5e 462
WiredHome 79:544eb4964795 463 _select(true);
WiredHome 79:544eb4964795 464 _spiwrite(0x40);
WiredHome 79:544eb4964795 465 data = _spiread();
WiredHome 79:544eb4964795 466 _select(false);
WiredHome 19:3f82c1161fd2 467 return data;
WiredHome 19:3f82c1161fd2 468 }
WiredHome 19:3f82c1161fd2 469
WiredHome 44:207594dece70 470
WiredHome 41:2956a0a221e5 471 uint16_t RA8875::ReadDataW(void)
WiredHome 41:2956a0a221e5 472 {
WiredHome 41:2956a0a221e5 473 uint16_t data;
WiredHome 73:f22a18707b5e 474
WiredHome 79:544eb4964795 475 _select(true);
WiredHome 79:544eb4964795 476 _spiwrite(0x40);
WiredHome 79:544eb4964795 477 data = _spiread();
WiredHome 79:544eb4964795 478 data |= (_spiread() << 8);
WiredHome 79:544eb4964795 479 _select(false);
WiredHome 41:2956a0a221e5 480 return data;
WiredHome 41:2956a0a221e5 481 }
WiredHome 41:2956a0a221e5 482
WiredHome 44:207594dece70 483
WiredHome 19:3f82c1161fd2 484 unsigned char RA8875::ReadStatus(void)
WiredHome 19:3f82c1161fd2 485 {
WiredHome 19:3f82c1161fd2 486 unsigned char data;
WiredHome 73:f22a18707b5e 487
WiredHome 79:544eb4964795 488 _select(true);
WiredHome 79:544eb4964795 489 _spiwrite(0xC0); // These two bits are for the special "Status Read" [STSR]
WiredHome 79:544eb4964795 490 data = _spiread();
WiredHome 79:544eb4964795 491 _select(false);
WiredHome 19:3f82c1161fd2 492 return data;
WiredHome 19:3f82c1161fd2 493 }
WiredHome 19:3f82c1161fd2 494
WiredHome 79:544eb4964795 495
WiredHome 66:468a11f05580 496 /// @todo add a timeout and return false, but how long
WiredHome 66:468a11f05580 497 /// to wait since some operations can be very long.
WiredHome 66:468a11f05580 498 bool RA8875::_WaitWhileBusy(uint8_t mask)
WiredHome 66:468a11f05580 499 {
WiredHome 66:468a11f05580 500 int i = 20000/POLLWAITuSec; // 20 msec max
WiredHome 66:468a11f05580 501
WiredHome 67:9f834f0ff97d 502 while (i-- && ReadStatus() & mask) {
WiredHome 66:468a11f05580 503 wait_us(POLLWAITuSec);
WiredHome 68:ab08efabfc88 504 COUNTIDLETIME(POLLWAITuSec);
WiredHome 67:9f834f0ff97d 505 }
WiredHome 66:468a11f05580 506 if (i)
WiredHome 66:468a11f05580 507 return true;
WiredHome 66:468a11f05580 508 else
WiredHome 66:468a11f05580 509 return false;
WiredHome 66:468a11f05580 510 }
WiredHome 66:468a11f05580 511
WiredHome 79:544eb4964795 512
WiredHome 66:468a11f05580 513 /// @todo add a timeout and return false, but how long
WiredHome 66:468a11f05580 514 /// to wait since some operations can be very long.
WiredHome 66:468a11f05580 515 bool RA8875::_WaitWhileReg(uint8_t reg, uint8_t mask)
WiredHome 66:468a11f05580 516 {
WiredHome 66:468a11f05580 517 int i = 20000/POLLWAITuSec; // 20 msec max
WiredHome 66:468a11f05580 518
WiredHome 67:9f834f0ff97d 519 while (i-- && ReadCommand(reg) & mask) {
WiredHome 66:468a11f05580 520 wait_us(POLLWAITuSec);
WiredHome 68:ab08efabfc88 521 COUNTIDLETIME(POLLWAITuSec);
WiredHome 67:9f834f0ff97d 522 }
WiredHome 66:468a11f05580 523 if (i)
WiredHome 66:468a11f05580 524 return true;
WiredHome 66:468a11f05580 525 else
WiredHome 66:468a11f05580 526 return false;
WiredHome 66:468a11f05580 527 }
WiredHome 66:468a11f05580 528
WiredHome 66:468a11f05580 529
WiredHome 37:f19b7e7449dc 530 dim_t RA8875::fontwidth(void)
WiredHome 19:3f82c1161fd2 531 {
WiredHome 19:3f82c1161fd2 532 if (font == NULL)
WiredHome 55:dfbabef7003e 533 return (((ReadCommand(0x22) >> 2) & 0x3) + 1) * 8;
WiredHome 19:3f82c1161fd2 534 else
WiredHome 29:422616aa04bd 535 return font[1];
WiredHome 19:3f82c1161fd2 536 }
WiredHome 19:3f82c1161fd2 537
WiredHome 44:207594dece70 538
WiredHome 37:f19b7e7449dc 539 dim_t RA8875::fontheight(void)
WiredHome 19:3f82c1161fd2 540 {
WiredHome 19:3f82c1161fd2 541 if (font == NULL)
WiredHome 23:a50ded45dbaf 542 return (((ReadCommand(0x22) >> 0) & 0x3) + 1) * 16;
WiredHome 19:3f82c1161fd2 543 else
WiredHome 29:422616aa04bd 544 return font[2];
WiredHome 19:3f82c1161fd2 545 }
WiredHome 19:3f82c1161fd2 546
WiredHome 44:207594dece70 547
WiredHome 37:f19b7e7449dc 548 RetCode_t RA8875::locate(textloc_t column, textloc_t row)
WiredHome 19:3f82c1161fd2 549 {
WiredHome 32:0e4f2ae512e2 550 return SetTextCursor(column * fontwidth(), row * fontheight());
WiredHome 19:3f82c1161fd2 551 }
WiredHome 19:3f82c1161fd2 552
WiredHome 44:207594dece70 553
WiredHome 19:3f82c1161fd2 554 int RA8875::columns(void)
WiredHome 19:3f82c1161fd2 555 {
WiredHome 19:3f82c1161fd2 556 return width() / fontwidth();
WiredHome 19:3f82c1161fd2 557 }
WiredHome 19:3f82c1161fd2 558
WiredHome 44:207594dece70 559
WiredHome 19:3f82c1161fd2 560 int RA8875::rows(void)
WiredHome 19:3f82c1161fd2 561 {
WiredHome 19:3f82c1161fd2 562 return height() / fontheight();
WiredHome 19:3f82c1161fd2 563 }
WiredHome 19:3f82c1161fd2 564
WiredHome 44:207594dece70 565
WiredHome 38:38d503b4fad6 566 dim_t RA8875::width(void)
WiredHome 19:3f82c1161fd2 567 {
WiredHome 29:422616aa04bd 568 return (ReadCommand(0x14) + 1) * 8;
WiredHome 19:3f82c1161fd2 569 }
WiredHome 19:3f82c1161fd2 570
WiredHome 44:207594dece70 571
WiredHome 38:38d503b4fad6 572 dim_t RA8875::height(void)
WiredHome 19:3f82c1161fd2 573 {
WiredHome 29:422616aa04bd 574 return (ReadCommand(0x19) | (ReadCommand(0x1A) << 8)) + 1;
WiredHome 19:3f82c1161fd2 575 }
WiredHome 19:3f82c1161fd2 576
WiredHome 44:207594dece70 577
WiredHome 43:3becae133285 578 dim_t RA8875::color_bpp(void)
WiredHome 43:3becae133285 579 {
WiredHome 43:3becae133285 580 if ((ReadCommand(0x10) & 0x0C) == 0x04)
WiredHome 43:3becae133285 581 return 16;
WiredHome 43:3becae133285 582 else
WiredHome 43:3becae133285 583 return 8;
WiredHome 43:3becae133285 584 }
WiredHome 43:3becae133285 585
WiredHome 44:207594dece70 586
WiredHome 37:f19b7e7449dc 587 RetCode_t RA8875::SetTextCursor(loc_t x, loc_t y)
WiredHome 19:3f82c1161fd2 588 {
WiredHome 75:ca78388cfd77 589 cursor_x = x; // set these values for non-internal fonts
WiredHome 75:ca78388cfd77 590 cursor_y = y;
WiredHome 38:38d503b4fad6 591 WriteCommandW(0x2A, x);
WiredHome 38:38d503b4fad6 592 WriteCommandW(0x2C, y);
WiredHome 19:3f82c1161fd2 593 return noerror;
WiredHome 19:3f82c1161fd2 594 }
WiredHome 19:3f82c1161fd2 595
WiredHome 44:207594dece70 596
WiredHome 37:f19b7e7449dc 597 loc_t RA8875::GetTextCursor_Y(void)
WiredHome 29:422616aa04bd 598 {
WiredHome 29:422616aa04bd 599 if (font == NULL)
WiredHome 29:422616aa04bd 600 return ReadCommand(0x2C) | (ReadCommand(0x2D) << 8);
WiredHome 29:422616aa04bd 601 else
WiredHome 29:422616aa04bd 602 return cursor_y;
WiredHome 29:422616aa04bd 603 }
WiredHome 29:422616aa04bd 604
WiredHome 44:207594dece70 605
WiredHome 37:f19b7e7449dc 606 loc_t RA8875::GetTextCursor_X(void)
WiredHome 29:422616aa04bd 607 {
WiredHome 29:422616aa04bd 608 if (font == NULL)
WiredHome 29:422616aa04bd 609 return ReadCommand(0x2A) | (ReadCommand(0x2B) << 8);
WiredHome 29:422616aa04bd 610 else
WiredHome 29:422616aa04bd 611 return cursor_x;
WiredHome 29:422616aa04bd 612 }
WiredHome 29:422616aa04bd 613
WiredHome 44:207594dece70 614
WiredHome 24:8ca861acf12d 615 RetCode_t RA8875::SetTextCursorControl(cursor_t cursor, bool blink)
WiredHome 23:a50ded45dbaf 616 {
WiredHome 23:a50ded45dbaf 617 unsigned char mwcr0 = ReadCommand(0x40) & 0x0F; // retain direction, auto-increase
WiredHome 43:3becae133285 618 unsigned char mwcr1 = ReadCommand(0x41) & 0x01; // retain currently selected layer
WiredHome 24:8ca861acf12d 619 unsigned char horz = 0;
WiredHome 24:8ca861acf12d 620 unsigned char vert = 0;
WiredHome 73:f22a18707b5e 621
WiredHome 24:8ca861acf12d 622 mwcr0 |= 0x80; // text mode
WiredHome 24:8ca861acf12d 623 if (cursor != NOCURSOR)
WiredHome 24:8ca861acf12d 624 mwcr0 |= 0x40; // visible
WiredHome 23:a50ded45dbaf 625 if (blink)
WiredHome 24:8ca861acf12d 626 mwcr0 |= 0x20; // blink
WiredHome 23:a50ded45dbaf 627 WriteCommand(0x40, mwcr0); // configure the cursor
WiredHome 43:3becae133285 628 WriteCommand(0x41, mwcr1); // close the graphics cursor
WiredHome 24:8ca861acf12d 629 WriteCommand(0x44, 0x1f); // The cursor flashing cycle
WiredHome 24:8ca861acf12d 630 switch (cursor) {
WiredHome 24:8ca861acf12d 631 case IBEAM:
WiredHome 24:8ca861acf12d 632 horz = 0x01;
WiredHome 24:8ca861acf12d 633 vert = 0x1F;
WiredHome 24:8ca861acf12d 634 break;
WiredHome 24:8ca861acf12d 635 case UNDER:
WiredHome 24:8ca861acf12d 636 horz = 0x07;
WiredHome 24:8ca861acf12d 637 vert = 0x01;
WiredHome 24:8ca861acf12d 638 break;
WiredHome 24:8ca861acf12d 639 case BLOCK:
WiredHome 24:8ca861acf12d 640 horz = 0x07;
WiredHome 24:8ca861acf12d 641 vert = 0x1F;
WiredHome 24:8ca861acf12d 642 break;
WiredHome 24:8ca861acf12d 643 case NOCURSOR:
WiredHome 24:8ca861acf12d 644 default:
WiredHome 24:8ca861acf12d 645 break;
WiredHome 24:8ca861acf12d 646 }
WiredHome 24:8ca861acf12d 647 WriteCommand(0x4e, horz); // The cursor size horz
WiredHome 24:8ca861acf12d 648 WriteCommand(0x4f, vert); // The cursor size vert
WiredHome 23:a50ded45dbaf 649 return noerror;
WiredHome 23:a50ded45dbaf 650 }
WiredHome 23:a50ded45dbaf 651
WiredHome 44:207594dece70 652
WiredHome 19:3f82c1161fd2 653 RetCode_t RA8875::SetTextFont(RA8875::font_t font)
WiredHome 19:3f82c1161fd2 654 {
WiredHome 19:3f82c1161fd2 655 if (/*font >= RA8875::ISO8859_1 && */ font <= RA8875::ISO8859_4) {
WiredHome 19:3f82c1161fd2 656 WriteCommand(0x21, (unsigned int)(font));
WiredHome 19:3f82c1161fd2 657 return noerror;
WiredHome 19:3f82c1161fd2 658 } else {
WiredHome 19:3f82c1161fd2 659 return bad_parameter;
WiredHome 19:3f82c1161fd2 660 }
WiredHome 19:3f82c1161fd2 661 }
WiredHome 19:3f82c1161fd2 662
WiredHome 44:207594dece70 663
WiredHome 19:3f82c1161fd2 664 RetCode_t RA8875::SetTextFontControl(fill_t fillit,
WiredHome 73:f22a18707b5e 665 RA8875::font_angle_t angle,
WiredHome 73:f22a18707b5e 666 RA8875::HorizontalScale hScale,
WiredHome 73:f22a18707b5e 667 RA8875::VerticalScale vScale,
WiredHome 73:f22a18707b5e 668 RA8875::alignment_t alignment)
WiredHome 19:3f82c1161fd2 669 {
WiredHome 73:f22a18707b5e 670 if (hScale >= 1 && hScale <= 4 &&
WiredHome 73:f22a18707b5e 671 vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 672 unsigned char x = 0;
WiredHome 73:f22a18707b5e 673
WiredHome 19:3f82c1161fd2 674 if (alignment == align_full)
WiredHome 19:3f82c1161fd2 675 x |= 0x80;
WiredHome 19:3f82c1161fd2 676 if (fillit == NOFILL)
WiredHome 19:3f82c1161fd2 677 x |= 0x40;
WiredHome 19:3f82c1161fd2 678 if (angle == rotated)
WiredHome 19:3f82c1161fd2 679 x |= 0x10;
WiredHome 19:3f82c1161fd2 680 x |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 681 x |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 682 WriteCommand(0x22, x);
WiredHome 19:3f82c1161fd2 683 return noerror;
WiredHome 19:3f82c1161fd2 684 } else {
WiredHome 19:3f82c1161fd2 685 return bad_parameter;
WiredHome 19:3f82c1161fd2 686 }
WiredHome 19:3f82c1161fd2 687 }
WiredHome 19:3f82c1161fd2 688
WiredHome 44:207594dece70 689
WiredHome 19:3f82c1161fd2 690 RetCode_t RA8875::SetTextFontSize(RA8875::HorizontalScale hScale, RA8875::VerticalScale vScale)
WiredHome 19:3f82c1161fd2 691 {
WiredHome 19:3f82c1161fd2 692 unsigned char reg = ReadCommand(0x22);
WiredHome 73:f22a18707b5e 693
WiredHome 40:04aa280dfa39 694 if (vScale == -1)
WiredHome 40:04aa280dfa39 695 vScale = hScale;
WiredHome 19:3f82c1161fd2 696 if (hScale >= 1 && hScale <= 4 && vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 697 reg &= 0xF0; // keep the high nibble as is.
WiredHome 19:3f82c1161fd2 698 reg |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 699 reg |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 700 WriteCommand(0x22, reg);
WiredHome 19:3f82c1161fd2 701 return noerror;
WiredHome 19:3f82c1161fd2 702 } else {
WiredHome 19:3f82c1161fd2 703 return bad_parameter;
WiredHome 19:3f82c1161fd2 704 }
WiredHome 19:3f82c1161fd2 705 }
WiredHome 19:3f82c1161fd2 706
WiredHome 44:207594dece70 707
WiredHome 19:3f82c1161fd2 708 int RA8875::_putc(int c)
WiredHome 19:3f82c1161fd2 709 {
WiredHome 29:422616aa04bd 710 if (font == NULL) {
WiredHome 29:422616aa04bd 711 return _internal_putc(c);
WiredHome 29:422616aa04bd 712 } else {
WiredHome 29:422616aa04bd 713 return _external_putc(c);
WiredHome 29:422616aa04bd 714 }
WiredHome 29:422616aa04bd 715 }
WiredHome 29:422616aa04bd 716
WiredHome 44:207594dece70 717
WiredHome 29:422616aa04bd 718 int RA8875::_external_putc(int c)
WiredHome 29:422616aa04bd 719 {
WiredHome 19:3f82c1161fd2 720 if (c) {
WiredHome 19:3f82c1161fd2 721 if (c == '\r') {
WiredHome 29:422616aa04bd 722 cursor_x = 0;
WiredHome 29:422616aa04bd 723 } else if (c == '\n') {
WiredHome 29:422616aa04bd 724 cursor_y += font[2];
WiredHome 29:422616aa04bd 725 } else {
WiredHome 29:422616aa04bd 726 int advance = character(cursor_x, cursor_y, c); // advance tells us how many pixels we advanced
WiredHome 37:f19b7e7449dc 727 //INFO("x,y,advance %d,%d,%d", cursor_x, cursor_y, advance);
WiredHome 29:422616aa04bd 728 if (advance) {
WiredHome 29:422616aa04bd 729 cursor_x += advance;
WiredHome 29:422616aa04bd 730 if (cursor_x >= width()) {
WiredHome 29:422616aa04bd 731 cursor_x = 0;
WiredHome 29:422616aa04bd 732 cursor_y += font[2];
WiredHome 29:422616aa04bd 733 if (cursor_y >= height()) {
WiredHome 29:422616aa04bd 734 cursor_y = 0; // @todo Should it scroll?
WiredHome 29:422616aa04bd 735 }
WiredHome 29:422616aa04bd 736 }
WiredHome 29:422616aa04bd 737 }
WiredHome 29:422616aa04bd 738 }
WiredHome 29:422616aa04bd 739 }
WiredHome 29:422616aa04bd 740 return c;
WiredHome 29:422616aa04bd 741 }
WiredHome 29:422616aa04bd 742
WiredHome 44:207594dece70 743
WiredHome 29:422616aa04bd 744 int RA8875::_internal_putc(int c)
WiredHome 29:422616aa04bd 745 {
WiredHome 29:422616aa04bd 746 if (c) {
WiredHome 29:422616aa04bd 747 unsigned char mwcr0;
WiredHome 73:f22a18707b5e 748
WiredHome 29:422616aa04bd 749 mwcr0 = ReadCommand(0x40);
WiredHome 29:422616aa04bd 750 if ((mwcr0 & 0x80) == 0x00) {
WiredHome 29:422616aa04bd 751 WriteCommand(0x40, 0x80 | mwcr0); // Put in Text mode if not already
WiredHome 29:422616aa04bd 752 }
WiredHome 29:422616aa04bd 753 if (c == '\r') {
WiredHome 37:f19b7e7449dc 754 loc_t x;
WiredHome 19:3f82c1161fd2 755 x = ReadCommand(0x30) | (ReadCommand(0x31) << 8); // Left edge of active window
WiredHome 38:38d503b4fad6 756 WriteCommandW(0x2A, x);
WiredHome 19:3f82c1161fd2 757 } else if (c == '\n') {
WiredHome 37:f19b7e7449dc 758 loc_t y;
WiredHome 19:3f82c1161fd2 759 y = ReadCommand(0x2C) | (ReadCommand(0x2D) << 8); // current y location
WiredHome 19:3f82c1161fd2 760 y += fontheight();
WiredHome 47:d96a09269f91 761 if (y >= height()) // @TODO after bottom of active window, then scroll window?
WiredHome 19:3f82c1161fd2 762 y = 0;
WiredHome 38:38d503b4fad6 763 WriteCommandW(0x2C, y);
WiredHome 19:3f82c1161fd2 764 } else {
WiredHome 29:422616aa04bd 765 WriteCommand(0x02); // RA8875 Internal Fonts
WiredHome 79:544eb4964795 766 _select(true);
WiredHome 29:422616aa04bd 767 WriteData(c);
WiredHome 66:468a11f05580 768 _WaitWhileBusy(0x80);
WiredHome 79:544eb4964795 769 _select(false);
WiredHome 19:3f82c1161fd2 770 }
WiredHome 19:3f82c1161fd2 771 }
WiredHome 19:3f82c1161fd2 772 return c;
WiredHome 19:3f82c1161fd2 773 }
WiredHome 19:3f82c1161fd2 774
WiredHome 44:207594dece70 775
WiredHome 32:0e4f2ae512e2 776 RetCode_t RA8875::_StartGraphicsStream(void)
WiredHome 32:0e4f2ae512e2 777 {
WiredHome 32:0e4f2ae512e2 778 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 32:0e4f2ae512e2 779 WriteCommand(0x02); // Prepare for streaming data
WiredHome 32:0e4f2ae512e2 780 return noerror;
WiredHome 32:0e4f2ae512e2 781 }
WiredHome 32:0e4f2ae512e2 782
WiredHome 44:207594dece70 783
WiredHome 32:0e4f2ae512e2 784 RetCode_t RA8875::_EndGraphicsStream(void)
WiredHome 32:0e4f2ae512e2 785 {
WiredHome 32:0e4f2ae512e2 786 return noerror;
WiredHome 32:0e4f2ae512e2 787 }
WiredHome 32:0e4f2ae512e2 788
WiredHome 44:207594dece70 789
WiredHome 55:dfbabef7003e 790 RetCode_t RA8875::_putp(color_t pixel)
WiredHome 32:0e4f2ae512e2 791 {
WiredHome 38:38d503b4fad6 792 WriteDataW((pixel>>8) | (pixel<<8));
WiredHome 73:f22a18707b5e 793 return noerror;
WiredHome 32:0e4f2ae512e2 794 }
WiredHome 29:422616aa04bd 795
WiredHome 44:207594dece70 796
WiredHome 37:f19b7e7449dc 797 void RA8875::puts(loc_t x, loc_t y, const char * string)
WiredHome 19:3f82c1161fd2 798 {
WiredHome 19:3f82c1161fd2 799 SetTextCursor(x,y);
WiredHome 19:3f82c1161fd2 800 puts(string);
WiredHome 19:3f82c1161fd2 801 }
WiredHome 19:3f82c1161fd2 802
WiredHome 44:207594dece70 803
WiredHome 19:3f82c1161fd2 804 void RA8875::puts(const char * string)
WiredHome 19:3f82c1161fd2 805 {
WiredHome 29:422616aa04bd 806 unsigned char mwcr0 = ReadCommand(0x40);
WiredHome 73:f22a18707b5e 807
WiredHome 37:f19b7e7449dc 808 if (font == NULL) {
WiredHome 37:f19b7e7449dc 809 if ((mwcr0 & 0x80) == 0x00)
WiredHome 37:f19b7e7449dc 810 WriteCommand(0x40,0x80); // Put in Text mode if not already
WiredHome 37:f19b7e7449dc 811 } else {
WiredHome 37:f19b7e7449dc 812 _StartGraphicsStream();
WiredHome 37:f19b7e7449dc 813 }
WiredHome 19:3f82c1161fd2 814 if (*string != '\0') {
WiredHome 73:f22a18707b5e 815 #if 1
WiredHome 29:422616aa04bd 816 while (*string) { // @TODO calling individual _putc is slower... optimizations?
WiredHome 19:3f82c1161fd2 817 _putc(*string++);
WiredHome 19:3f82c1161fd2 818 }
WiredHome 73:f22a18707b5e 819 #else
WiredHome 19:3f82c1161fd2 820 WriteCommand(0x02);
WiredHome 79:544eb4964795 821 _select(true);
WiredHome 19:3f82c1161fd2 822 while (*string != '\0') {
WiredHome 19:3f82c1161fd2 823 WriteData(*string);
WiredHome 19:3f82c1161fd2 824 ++string;
WiredHome 66:468a11f05580 825 _WaitWhileBusy(0x80);
WiredHome 19:3f82c1161fd2 826 }
WiredHome 79:544eb4964795 827 _select(false);
WiredHome 73:f22a18707b5e 828 #endif
WiredHome 19:3f82c1161fd2 829 }
WiredHome 37:f19b7e7449dc 830 if (font)
WiredHome 37:f19b7e7449dc 831 _EndGraphicsStream();
WiredHome 19:3f82c1161fd2 832 }
WiredHome 19:3f82c1161fd2 833
WiredHome 44:207594dece70 834
WiredHome 37:f19b7e7449dc 835 RetCode_t RA8875::SetGraphicsCursor(loc_t x, loc_t y)
WiredHome 19:3f82c1161fd2 836 {
WiredHome 38:38d503b4fad6 837 WriteCommandW(0x46, x);
WiredHome 38:38d503b4fad6 838 WriteCommandW(0x48, y);
WiredHome 19:3f82c1161fd2 839 return noerror;
WiredHome 19:3f82c1161fd2 840 }
WiredHome 19:3f82c1161fd2 841
WiredHome 44:207594dece70 842
WiredHome 41:2956a0a221e5 843 RetCode_t RA8875::SetGraphicsCursorRead(loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 844 {
WiredHome 41:2956a0a221e5 845 //WriteCommand(0x40, 0); // Graphics mode
WiredHome 41:2956a0a221e5 846 //WriteCommand(0x45, 0); // left->right, top->bottom
WiredHome 41:2956a0a221e5 847 WriteCommandW(0x4A, x);
WiredHome 41:2956a0a221e5 848 WriteCommandW(0x4C, y);
WiredHome 41:2956a0a221e5 849 return noerror;
WiredHome 41:2956a0a221e5 850 }
WiredHome 41:2956a0a221e5 851
WiredHome 44:207594dece70 852
WiredHome 37:f19b7e7449dc 853 RetCode_t RA8875::window(loc_t x, loc_t y, dim_t width, dim_t height)
WiredHome 19:3f82c1161fd2 854 {
WiredHome 37:f19b7e7449dc 855 GraphicsDisplay::window(x,y, width,height);
WiredHome 38:38d503b4fad6 856 WriteCommandW(0x30, x);
WiredHome 38:38d503b4fad6 857 WriteCommandW(0x32, y);
WiredHome 38:38d503b4fad6 858 WriteCommandW(0x34, (x+width-1));
WiredHome 38:38d503b4fad6 859 WriteCommandW(0x36, (y+height-1));
WiredHome 37:f19b7e7449dc 860 SetGraphicsCursor(x,y);
WiredHome 19:3f82c1161fd2 861 return noerror;
WiredHome 19:3f82c1161fd2 862 }
WiredHome 19:3f82c1161fd2 863
WiredHome 44:207594dece70 864
WiredHome 61:8f3153bf0baa 865 RetCode_t RA8875::cls(uint16_t layers)
WiredHome 19:3f82c1161fd2 866 {
WiredHome 61:8f3153bf0baa 867 RetCode_t ret;
WiredHome 73:f22a18707b5e 868
WiredHome 19:3f82c1161fd2 869 PERFORMANCE_RESET;
WiredHome 61:8f3153bf0baa 870 if (layers == 0) {
WiredHome 61:8f3153bf0baa 871 ret = clsw(FULLWINDOW);
WiredHome 61:8f3153bf0baa 872 ret = SetTextCursor(0,0);
WiredHome 61:8f3153bf0baa 873 } else if (layers > 3) {
WiredHome 61:8f3153bf0baa 874 ret = bad_parameter;
WiredHome 61:8f3153bf0baa 875 } else {
WiredHome 61:8f3153bf0baa 876 uint16_t prevLayer = GetDrawingLayer();
WiredHome 61:8f3153bf0baa 877 if (layers & 1) {
WiredHome 61:8f3153bf0baa 878 SelectDrawingLayer(0);
WiredHome 61:8f3153bf0baa 879 clsw(FULLWINDOW);
WiredHome 61:8f3153bf0baa 880 }
WiredHome 61:8f3153bf0baa 881 if (layers & 2) {
WiredHome 61:8f3153bf0baa 882 SelectDrawingLayer(1);
WiredHome 61:8f3153bf0baa 883 clsw(FULLWINDOW);
WiredHome 61:8f3153bf0baa 884 }
WiredHome 61:8f3153bf0baa 885 ret = SelectDrawingLayer(prevLayer);
WiredHome 61:8f3153bf0baa 886 }
WiredHome 19:3f82c1161fd2 887 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 61:8f3153bf0baa 888 return ret;
WiredHome 19:3f82c1161fd2 889 }
WiredHome 19:3f82c1161fd2 890
WiredHome 44:207594dece70 891
WiredHome 19:3f82c1161fd2 892 RetCode_t RA8875::clsw(RA8875::Region_t region)
WiredHome 19:3f82c1161fd2 893 {
WiredHome 19:3f82c1161fd2 894 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 895 WriteCommand(0x8E, (region == ACTIVEWINDOW) ? 0xC0 : 0x80);
WiredHome 66:468a11f05580 896 _WaitWhileReg(0x8E, 0x80);
WiredHome 19:3f82c1161fd2 897 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 19:3f82c1161fd2 898 return noerror;
WiredHome 19:3f82c1161fd2 899 }
WiredHome 19:3f82c1161fd2 900
WiredHome 44:207594dece70 901
WiredHome 37:f19b7e7449dc 902 RetCode_t RA8875::pixel(loc_t x, loc_t y, color_t color)
WiredHome 19:3f82c1161fd2 903 {
WiredHome 62:ba5d33438fda 904 RetCode_t ret;
WiredHome 73:f22a18707b5e 905
WiredHome 62:ba5d33438fda 906 PERFORMANCE_RESET;
WiredHome 73:f22a18707b5e 907 #if 1
WiredHome 62:ba5d33438fda 908 ret = pixelStream(&color, 1, x,y);
WiredHome 73:f22a18707b5e 909 #else
WiredHome 19:3f82c1161fd2 910 foreground(color);
WiredHome 62:ba5d33438fda 911 ret = pixel(x,y);
WiredHome 73:f22a18707b5e 912 #endif
WiredHome 62:ba5d33438fda 913 REGISTERPERFORMANCE(PRF_DRAWPIXEL);
WiredHome 62:ba5d33438fda 914 return ret;
WiredHome 19:3f82c1161fd2 915 }
WiredHome 19:3f82c1161fd2 916
WiredHome 44:207594dece70 917
WiredHome 37:f19b7e7449dc 918 RetCode_t RA8875::pixel(loc_t x, loc_t y)
WiredHome 19:3f82c1161fd2 919 {
WiredHome 19:3f82c1161fd2 920 RetCode_t ret;
WiredHome 73:f22a18707b5e 921
WiredHome 19:3f82c1161fd2 922 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 923 color_t color = GetForeColor();
WiredHome 73:f22a18707b5e 924 #if 1
WiredHome 62:ba5d33438fda 925 ret = pixelStream(&color, 1, x, y);
WiredHome 73:f22a18707b5e 926 #else
WiredHome 19:3f82c1161fd2 927 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 32:0e4f2ae512e2 928 SetGraphicsCursor(x, y);
WiredHome 38:38d503b4fad6 929 WriteCommand(0x02);
WiredHome 38:38d503b4fad6 930 WriteDataW(color);
WiredHome 19:3f82c1161fd2 931 ret = noerror;
WiredHome 73:f22a18707b5e 932 #endif
WiredHome 41:2956a0a221e5 933 REGISTERPERFORMANCE(PRF_DRAWPIXEL);
WiredHome 19:3f82c1161fd2 934 return ret;
WiredHome 19:3f82c1161fd2 935 }
WiredHome 19:3f82c1161fd2 936
WiredHome 44:207594dece70 937
WiredHome 41:2956a0a221e5 938 RetCode_t RA8875::pixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 939 {
WiredHome 41:2956a0a221e5 940 PERFORMANCE_RESET;
WiredHome 41:2956a0a221e5 941 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 41:2956a0a221e5 942 SetGraphicsCursor(x, y);
WiredHome 41:2956a0a221e5 943 WriteCommand(0x02);
WiredHome 79:544eb4964795 944 _select(true);
WiredHome 79:544eb4964795 945 _spiwrite(0x00); // Cmd: write data
WiredHome 41:2956a0a221e5 946 while (count--) {
WiredHome 79:544eb4964795 947 _spiwrite(*p >> 8);
WiredHome 79:544eb4964795 948 _spiwrite(*p & 0xFF);
WiredHome 41:2956a0a221e5 949 p++;
WiredHome 41:2956a0a221e5 950 }
WiredHome 79:544eb4964795 951 _select(false);
WiredHome 41:2956a0a221e5 952 REGISTERPERFORMANCE(PRF_PIXELSTREAM);
WiredHome 41:2956a0a221e5 953 return(noerror);
WiredHome 41:2956a0a221e5 954 }
WiredHome 41:2956a0a221e5 955
WiredHome 44:207594dece70 956
WiredHome 41:2956a0a221e5 957 color_t RA8875::getPixel(loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 958 {
WiredHome 41:2956a0a221e5 959 color_t pixel;
WiredHome 73:f22a18707b5e 960
WiredHome 41:2956a0a221e5 961 PERFORMANCE_RESET;
WiredHome 41:2956a0a221e5 962 //WriteCommand(0x45,0x00); // read left->right, top->bottom
WiredHome 41:2956a0a221e5 963 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 41:2956a0a221e5 964 SetGraphicsCursorRead(x, y);
WiredHome 41:2956a0a221e5 965 WriteCommand(0x02);
WiredHome 79:544eb4964795 966 _select(true);
WiredHome 79:544eb4964795 967 _spiwrite(0x40); // Cmd: read data
WiredHome 79:544eb4964795 968 _spiwrite(0x00); // dummy read
WiredHome 79:544eb4964795 969 pixel = _spiread();
WiredHome 79:544eb4964795 970 pixel |= (_spiread() << 8);
WiredHome 79:544eb4964795 971 _select(false);
WiredHome 41:2956a0a221e5 972 REGISTERPERFORMANCE(PRF_READPIXEL);
WiredHome 41:2956a0a221e5 973 return pixel;
WiredHome 41:2956a0a221e5 974 }
WiredHome 41:2956a0a221e5 975
WiredHome 44:207594dece70 976
WiredHome 41:2956a0a221e5 977 RetCode_t RA8875::getPixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
WiredHome 41:2956a0a221e5 978 {
WiredHome 41:2956a0a221e5 979 color_t pixel;
WiredHome 73:f22a18707b5e 980
WiredHome 41:2956a0a221e5 981 PERFORMANCE_RESET;
WiredHome 41:2956a0a221e5 982 //WriteCommand(0x45,0x00); // read left->right, top->bottom
WiredHome 41:2956a0a221e5 983 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 41:2956a0a221e5 984 SetGraphicsCursorRead(x, y);
WiredHome 41:2956a0a221e5 985 WriteCommand(0x02);
WiredHome 79:544eb4964795 986 _select(true);
WiredHome 79:544eb4964795 987 _spiwrite(0x40); // Cmd: read data
WiredHome 79:544eb4964795 988 _spiwrite(0x00); // dummy read
WiredHome 41:2956a0a221e5 989 while (count--) {
WiredHome 79:544eb4964795 990 pixel = _spiread();
WiredHome 79:544eb4964795 991 pixel |= (_spiread() << 8);
WiredHome 41:2956a0a221e5 992 *p++ = pixel;
WiredHome 41:2956a0a221e5 993 }
WiredHome 79:544eb4964795 994 _select(false);
WiredHome 41:2956a0a221e5 995 REGISTERPERFORMANCE(PRF_READPIXELSTREAM);
WiredHome 41:2956a0a221e5 996 return noerror;
WiredHome 41:2956a0a221e5 997 }
WiredHome 41:2956a0a221e5 998
WiredHome 44:207594dece70 999
WiredHome 37:f19b7e7449dc 1000 RetCode_t RA8875::line(loc_t x1, loc_t y1, loc_t x2, loc_t y2, color_t color)
WiredHome 19:3f82c1161fd2 1001 {
WiredHome 19:3f82c1161fd2 1002 foreground(color);
WiredHome 19:3f82c1161fd2 1003 return line(x1,y1,x2,y2);
WiredHome 19:3f82c1161fd2 1004 }
WiredHome 19:3f82c1161fd2 1005
WiredHome 44:207594dece70 1006
WiredHome 37:f19b7e7449dc 1007 RetCode_t RA8875::line(loc_t x1, loc_t y1, loc_t x2, loc_t y2)
WiredHome 19:3f82c1161fd2 1008 {
WiredHome 19:3f82c1161fd2 1009 PERFORMANCE_RESET;
WiredHome 62:ba5d33438fda 1010 if (x1 == x2 && y1 == y2) {
WiredHome 60:2dfd574f63bd 1011 pixel(x1, y1);
WiredHome 62:ba5d33438fda 1012 } else {
WiredHome 60:2dfd574f63bd 1013 WriteCommandW(0x91, x1);
WiredHome 60:2dfd574f63bd 1014 WriteCommandW(0x93, y1);
WiredHome 60:2dfd574f63bd 1015 WriteCommandW(0x95, x2);
WiredHome 60:2dfd574f63bd 1016 WriteCommandW(0x97, y2);
WiredHome 60:2dfd574f63bd 1017 unsigned char drawCmd = 0x00; // Line
WiredHome 60:2dfd574f63bd 1018 WriteCommand(0x90, drawCmd);
WiredHome 60:2dfd574f63bd 1019 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1020 _WaitWhileReg(0x90, 0x80);
WiredHome 60:2dfd574f63bd 1021 }
WiredHome 19:3f82c1161fd2 1022 REGISTERPERFORMANCE(PRF_DRAWLINE);
WiredHome 19:3f82c1161fd2 1023 return noerror;
WiredHome 19:3f82c1161fd2 1024 }
WiredHome 19:3f82c1161fd2 1025
WiredHome 44:207594dece70 1026
WiredHome 73:f22a18707b5e 1027 RetCode_t RA8875::fillrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1028 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1029 {
WiredHome 19:3f82c1161fd2 1030 return rect(x1,y1,x2,y2,color,fillit);
WiredHome 19:3f82c1161fd2 1031 }
WiredHome 19:3f82c1161fd2 1032
WiredHome 44:207594dece70 1033
WiredHome 73:f22a18707b5e 1034 RetCode_t RA8875::rect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1035 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1036 {
WiredHome 19:3f82c1161fd2 1037 foreground(color);
WiredHome 19:3f82c1161fd2 1038 return rect(x1,y1,x2,y2,fillit);
WiredHome 19:3f82c1161fd2 1039 }
WiredHome 19:3f82c1161fd2 1040
WiredHome 44:207594dece70 1041
WiredHome 73:f22a18707b5e 1042 RetCode_t RA8875::rect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1043 fill_t fillit)
WiredHome 19:3f82c1161fd2 1044 {
WiredHome 19:3f82c1161fd2 1045 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 1046 if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 1047 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 1048 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 1049 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 1050 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 1051 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 1052 } else {
WiredHome 38:38d503b4fad6 1053 WriteCommandW(0x91, x1);
WiredHome 38:38d503b4fad6 1054 WriteCommandW(0x93, y1);
WiredHome 38:38d503b4fad6 1055 WriteCommandW(0x95, x2);
WiredHome 38:38d503b4fad6 1056 WriteCommandW(0x97, y2);
WiredHome 19:3f82c1161fd2 1057 unsigned char drawCmd = 0x10; // Rectangle
WiredHome 19:3f82c1161fd2 1058 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1059 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 1060 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 1061 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1062 _WaitWhileReg(0x90, 0x80);
WiredHome 19:3f82c1161fd2 1063 }
WiredHome 19:3f82c1161fd2 1064 REGISTERPERFORMANCE(PRF_DRAWRECTANGLE);
WiredHome 19:3f82c1161fd2 1065 return noerror;
WiredHome 19:3f82c1161fd2 1066 }
WiredHome 19:3f82c1161fd2 1067
WiredHome 44:207594dece70 1068
WiredHome 73:f22a18707b5e 1069 RetCode_t RA8875::fillroundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1070 dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1071 {
WiredHome 19:3f82c1161fd2 1072 foreground(color);
WiredHome 19:3f82c1161fd2 1073 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 1074 }
WiredHome 19:3f82c1161fd2 1075
WiredHome 44:207594dece70 1076
WiredHome 73:f22a18707b5e 1077 RetCode_t RA8875::roundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1078 dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1079 {
WiredHome 19:3f82c1161fd2 1080 foreground(color);
WiredHome 19:3f82c1161fd2 1081 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 1082 }
WiredHome 19:3f82c1161fd2 1083
WiredHome 44:207594dece70 1084
WiredHome 73:f22a18707b5e 1085 RetCode_t RA8875::roundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1086 dim_t radius1, dim_t radius2, fill_t fillit)
WiredHome 19:3f82c1161fd2 1087 {
WiredHome 19:3f82c1161fd2 1088 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1089
WiredHome 19:3f82c1161fd2 1090 PERFORMANCE_RESET;
WiredHome 21:3c1efb192927 1091 if (x1 > x2 || y1 > y2 || (radius1 > (x2-x1)/2) || (radius2 > (y2-y1)/2) ) {
WiredHome 21:3c1efb192927 1092 ret = bad_parameter;
WiredHome 21:3c1efb192927 1093 } else if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 1094 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 1095 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 1096 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 1097 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 1098 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 1099 } else {
WiredHome 38:38d503b4fad6 1100 WriteCommandW(0x91, x1);
WiredHome 38:38d503b4fad6 1101 WriteCommandW(0x93, y1);
WiredHome 38:38d503b4fad6 1102 WriteCommandW(0x95, x2);
WiredHome 38:38d503b4fad6 1103 WriteCommandW(0x97, y2);
WiredHome 38:38d503b4fad6 1104 WriteCommandW(0xA1, radius1);
WiredHome 38:38d503b4fad6 1105 WriteCommandW(0xA3, radius2);
WiredHome 21:3c1efb192927 1106 // Should not need this...
WiredHome 38:38d503b4fad6 1107 WriteCommandW(0xA5, 0);
WiredHome 38:38d503b4fad6 1108 WriteCommandW(0xA7, 0);
WiredHome 19:3f82c1161fd2 1109 unsigned char drawCmd = 0x20; // Rounded Rectangle
WiredHome 19:3f82c1161fd2 1110 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1111 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 1112 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 1113 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1114 _WaitWhileReg(0xA0, 0x80);
WiredHome 19:3f82c1161fd2 1115 }
WiredHome 19:3f82c1161fd2 1116 REGISTERPERFORMANCE(PRF_DRAWROUNDEDRECTANGLE);
WiredHome 19:3f82c1161fd2 1117 return ret;
WiredHome 19:3f82c1161fd2 1118 }
WiredHome 19:3f82c1161fd2 1119
WiredHome 44:207594dece70 1120
WiredHome 73:f22a18707b5e 1121 RetCode_t RA8875::triangle(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1122 loc_t x3, loc_t y3, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1123 {
WiredHome 20:6e2e4a8372eb 1124 RetCode_t ret;
WiredHome 20:6e2e4a8372eb 1125
WiredHome 19:3f82c1161fd2 1126 foreground(color);
WiredHome 20:6e2e4a8372eb 1127 ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
WiredHome 20:6e2e4a8372eb 1128 return ret;
WiredHome 19:3f82c1161fd2 1129 }
WiredHome 19:3f82c1161fd2 1130
WiredHome 44:207594dece70 1131
WiredHome 73:f22a18707b5e 1132 RetCode_t RA8875::filltriangle(loc_t x1, loc_t y1, loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1133 loc_t x3, loc_t y3, color_t color, fill_t fillit)
WiredHome 73:f22a18707b5e 1134 {
WiredHome 73:f22a18707b5e 1135 RetCode_t ret;
WiredHome 73:f22a18707b5e 1136
WiredHome 73:f22a18707b5e 1137 foreground(color);
WiredHome 73:f22a18707b5e 1138 ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
WiredHome 73:f22a18707b5e 1139 return ret;
WiredHome 73:f22a18707b5e 1140 }
WiredHome 73:f22a18707b5e 1141
WiredHome 73:f22a18707b5e 1142
WiredHome 73:f22a18707b5e 1143 RetCode_t RA8875::triangle(loc_t x1, loc_t y1 ,loc_t x2, loc_t y2,
WiredHome 73:f22a18707b5e 1144 loc_t x3, loc_t y3, fill_t fillit)
WiredHome 19:3f82c1161fd2 1145 {
WiredHome 19:3f82c1161fd2 1146 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1147
WiredHome 19:3f82c1161fd2 1148 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 1149 if (x1 == x2 && y1 == y2 && x1 == x3 && y1 == y3) {
WiredHome 19:3f82c1161fd2 1150 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 1151 } else {
WiredHome 38:38d503b4fad6 1152 WriteCommandW(0x91, x1);
WiredHome 38:38d503b4fad6 1153 WriteCommandW(0x93, y1);
WiredHome 38:38d503b4fad6 1154 WriteCommandW(0x95, x2);
WiredHome 38:38d503b4fad6 1155 WriteCommandW(0x97, y2);
WiredHome 38:38d503b4fad6 1156 WriteCommandW(0xA9, x3);
WiredHome 38:38d503b4fad6 1157 WriteCommandW(0xAB, y3);
WiredHome 19:3f82c1161fd2 1158 unsigned char drawCmd = 0x01; // Triangle
WiredHome 19:3f82c1161fd2 1159 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1160 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 1161 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 1162 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1163 _WaitWhileReg(0x90, 0x80);
WiredHome 19:3f82c1161fd2 1164 }
WiredHome 19:3f82c1161fd2 1165 REGISTERPERFORMANCE(PRF_DRAWTRIANGLE);
WiredHome 19:3f82c1161fd2 1166 return ret;
WiredHome 19:3f82c1161fd2 1167 }
WiredHome 19:3f82c1161fd2 1168
WiredHome 73:f22a18707b5e 1169 RetCode_t RA8875::circle(loc_t x, loc_t y, dim_t radius,
WiredHome 73:f22a18707b5e 1170 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1171 {
WiredHome 19:3f82c1161fd2 1172 foreground(color);
WiredHome 19:3f82c1161fd2 1173 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 1174 }
WiredHome 19:3f82c1161fd2 1175
WiredHome 44:207594dece70 1176
WiredHome 73:f22a18707b5e 1177 RetCode_t RA8875::fillcircle(loc_t x, loc_t y, dim_t radius,
WiredHome 73:f22a18707b5e 1178 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1179 {
WiredHome 19:3f82c1161fd2 1180 foreground(color);
WiredHome 19:3f82c1161fd2 1181 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 1182 }
WiredHome 19:3f82c1161fd2 1183
WiredHome 44:207594dece70 1184
WiredHome 37:f19b7e7449dc 1185 RetCode_t RA8875::circle(loc_t x, loc_t y, dim_t radius, fill_t fillit)
WiredHome 19:3f82c1161fd2 1186 {
WiredHome 19:3f82c1161fd2 1187 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1188
WiredHome 19:3f82c1161fd2 1189 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 1190 if (radius <= 0) {
WiredHome 19:3f82c1161fd2 1191 ret = bad_parameter;
WiredHome 19:3f82c1161fd2 1192 } else if (radius == 1) {
WiredHome 19:3f82c1161fd2 1193 pixel(x,y);
WiredHome 19:3f82c1161fd2 1194 } else {
WiredHome 38:38d503b4fad6 1195 WriteCommandW(0x99, x);
WiredHome 38:38d503b4fad6 1196 WriteCommandW(0x9B, y);
WiredHome 19:3f82c1161fd2 1197 WriteCommand(0x9d, radius & 0xFF);
WiredHome 19:3f82c1161fd2 1198 unsigned char drawCmd = 0x00; // Circle
WiredHome 19:3f82c1161fd2 1199 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1200 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 1201 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 1202 WriteCommand(0x90, 0x40 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1203 _WaitWhileReg(0x90, 0x40);
WiredHome 19:3f82c1161fd2 1204 }
WiredHome 19:3f82c1161fd2 1205 REGISTERPERFORMANCE(PRF_DRAWCIRCLE);
WiredHome 19:3f82c1161fd2 1206 return ret;
WiredHome 19:3f82c1161fd2 1207 }
WiredHome 19:3f82c1161fd2 1208
WiredHome 44:207594dece70 1209
WiredHome 37:f19b7e7449dc 1210 RetCode_t RA8875::ellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 1211 {
WiredHome 19:3f82c1161fd2 1212 foreground(color);
WiredHome 25:9556a3a9b7cc 1213 return ellipse(x,y,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 1214 }
WiredHome 19:3f82c1161fd2 1215
WiredHome 44:207594dece70 1216
WiredHome 37:f19b7e7449dc 1217 RetCode_t RA8875::fillellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
WiredHome 25:9556a3a9b7cc 1218 {
WiredHome 25:9556a3a9b7cc 1219 foreground(color);
WiredHome 25:9556a3a9b7cc 1220 return ellipse(x,y,radius1,radius2,fillit);
WiredHome 25:9556a3a9b7cc 1221 }
WiredHome 44:207594dece70 1222
WiredHome 73:f22a18707b5e 1223
WiredHome 37:f19b7e7449dc 1224 RetCode_t RA8875::ellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, fill_t fillit)
WiredHome 19:3f82c1161fd2 1225 {
WiredHome 19:3f82c1161fd2 1226 RetCode_t ret = noerror;
WiredHome 73:f22a18707b5e 1227
WiredHome 19:3f82c1161fd2 1228 PERFORMANCE_RESET;
WiredHome 25:9556a3a9b7cc 1229 if (radius1 <= 0 || radius2 <= 0) {
WiredHome 19:3f82c1161fd2 1230 ; // do nothing
WiredHome 25:9556a3a9b7cc 1231 } else if (radius1 == 1 && radius2 == 1) {
WiredHome 19:3f82c1161fd2 1232 pixel(x, y);
WiredHome 19:3f82c1161fd2 1233 } else {
WiredHome 38:38d503b4fad6 1234 WriteCommandW(0xA5, x);
WiredHome 38:38d503b4fad6 1235 WriteCommandW(0xA7, y);
WiredHome 38:38d503b4fad6 1236 WriteCommandW(0xA1, radius1);
WiredHome 38:38d503b4fad6 1237 WriteCommandW(0xA3, radius2);
WiredHome 19:3f82c1161fd2 1238 unsigned char drawCmd = 0x00; // Ellipse
WiredHome 19:3f82c1161fd2 1239 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 1240 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 1241 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 1242 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 66:468a11f05580 1243 _WaitWhileReg(0xA0, 0x80);
WiredHome 19:3f82c1161fd2 1244 }
WiredHome 19:3f82c1161fd2 1245 REGISTERPERFORMANCE(PRF_DRAWELLIPSE);
WiredHome 19:3f82c1161fd2 1246 return ret;
WiredHome 19:3f82c1161fd2 1247 }
WiredHome 19:3f82c1161fd2 1248
WiredHome 44:207594dece70 1249
WiredHome 68:ab08efabfc88 1250 RetCode_t RA8875::frequency(unsigned long Hz, unsigned long Hz2)
WiredHome 19:3f82c1161fd2 1251 {
WiredHome 66:468a11f05580 1252 spiwritefreq = Hz;
WiredHome 68:ab08efabfc88 1253 if (Hz2 != 0)
WiredHome 68:ab08efabfc88 1254 spireadfreq = Hz2;
WiredHome 68:ab08efabfc88 1255 else
WiredHome 68:ab08efabfc88 1256 spireadfreq = Hz/2;
WiredHome 68:ab08efabfc88 1257 _setWriteSpeed(true);
WiredHome 19:3f82c1161fd2 1258 // __ ___
WiredHome 19:3f82c1161fd2 1259 // Clock ___A Rising edge latched
WiredHome 19:3f82c1161fd2 1260 // ___ ____
WiredHome 19:3f82c1161fd2 1261 // Data ___X____
WiredHome 19:3f82c1161fd2 1262 spi.format(8, 3); // 8 bits and clock to data phase 0
WiredHome 19:3f82c1161fd2 1263 return noerror;
WiredHome 19:3f82c1161fd2 1264 }
WiredHome 19:3f82c1161fd2 1265
WiredHome 68:ab08efabfc88 1266 void RA8875::_setWriteSpeed(bool writeSpeed)
WiredHome 68:ab08efabfc88 1267 {
WiredHome 68:ab08efabfc88 1268 if (writeSpeed) {
WiredHome 68:ab08efabfc88 1269 spi.frequency(spiwritefreq);
WiredHome 68:ab08efabfc88 1270 spiWriteSpeed = true;
WiredHome 68:ab08efabfc88 1271 } else {
WiredHome 68:ab08efabfc88 1272 spi.frequency(spireadfreq);
WiredHome 68:ab08efabfc88 1273 spiWriteSpeed = false;
WiredHome 68:ab08efabfc88 1274 }
WiredHome 68:ab08efabfc88 1275 }
WiredHome 44:207594dece70 1276
WiredHome 19:3f82c1161fd2 1277 RetCode_t RA8875::Power(bool on)
WiredHome 19:3f82c1161fd2 1278 {
WiredHome 19:3f82c1161fd2 1279 WriteCommand(0x01, (on) ? 0x80 : 0x00);
WiredHome 19:3f82c1161fd2 1280 return noerror;
WiredHome 19:3f82c1161fd2 1281 }
WiredHome 19:3f82c1161fd2 1282
WiredHome 44:207594dece70 1283
WiredHome 19:3f82c1161fd2 1284 RetCode_t RA8875::Backlight_u8(unsigned char brightness)
WiredHome 19:3f82c1161fd2 1285 {
WiredHome 19:3f82c1161fd2 1286 static bool is_enabled = false;
WiredHome 19:3f82c1161fd2 1287 if (brightness == 0) {
WiredHome 19:3f82c1161fd2 1288 WriteCommand(0x8a); // Disable the PWM
WiredHome 19:3f82c1161fd2 1289 WriteData(0x00);
WiredHome 19:3f82c1161fd2 1290 is_enabled = false;
WiredHome 19:3f82c1161fd2 1291 } else if (!is_enabled) {
WiredHome 19:3f82c1161fd2 1292 WriteCommand(0x8a); // Enable the PWM
WiredHome 19:3f82c1161fd2 1293 WriteData(0x80);
WiredHome 19:3f82c1161fd2 1294 WriteCommand(0x8a); // Not sure why this is needed, but following the pattern
WiredHome 19:3f82c1161fd2 1295 WriteData(0x81); // open PWM (SYS_CLK / 2 as best I can tell)
WiredHome 19:3f82c1161fd2 1296 is_enabled = true;
WiredHome 19:3f82c1161fd2 1297 }
WiredHome 19:3f82c1161fd2 1298 WriteCommand(0x8b, brightness); // Brightness parameter 0xff-0x00
WiredHome 19:3f82c1161fd2 1299 return noerror;
WiredHome 19:3f82c1161fd2 1300 }
WiredHome 19:3f82c1161fd2 1301
WiredHome 44:207594dece70 1302
WiredHome 19:3f82c1161fd2 1303 RetCode_t RA8875::Backlight(float brightness)
WiredHome 19:3f82c1161fd2 1304 {
WiredHome 19:3f82c1161fd2 1305 unsigned char b;
WiredHome 73:f22a18707b5e 1306
WiredHome 29:422616aa04bd 1307 if (brightness >= 1.0)
WiredHome 19:3f82c1161fd2 1308 b = 255;
WiredHome 29:422616aa04bd 1309 else if (brightness <= 0.0)
WiredHome 19:3f82c1161fd2 1310 b = 0;
WiredHome 19:3f82c1161fd2 1311 else
WiredHome 19:3f82c1161fd2 1312 b = (unsigned char)(brightness * 255);
WiredHome 19:3f82c1161fd2 1313 return Backlight_u8(b);
WiredHome 19:3f82c1161fd2 1314 }
WiredHome 19:3f82c1161fd2 1315
WiredHome 44:207594dece70 1316
WiredHome 19:3f82c1161fd2 1317 RetCode_t RA8875::set_font(const unsigned char * _font)
WiredHome 19:3f82c1161fd2 1318 {
WiredHome 37:f19b7e7449dc 1319 if (font && ! _font) {
WiredHome 37:f19b7e7449dc 1320 SetTextCursor(cursor_x, cursor_y); // soft-font cursor -> hw cursor
WiredHome 37:f19b7e7449dc 1321 }
WiredHome 19:3f82c1161fd2 1322 font = _font;
WiredHome 29:422616aa04bd 1323 GraphicsDisplay::set_font(_font);
WiredHome 29:422616aa04bd 1324 return noerror; // trusting them, but it might be good to put some checks in here...
WiredHome 19:3f82c1161fd2 1325 }
WiredHome 19:3f82c1161fd2 1326
WiredHome 44:207594dece70 1327
WiredHome 19:3f82c1161fd2 1328 RetCode_t RA8875::background(color_t color)
WiredHome 19:3f82c1161fd2 1329 {
WiredHome 37:f19b7e7449dc 1330 GraphicsDisplay::background(color);
WiredHome 19:3f82c1161fd2 1331 WriteCommand(0x60, (color>>11)); // BGCR0
WiredHome 19:3f82c1161fd2 1332 WriteCommand(0x61, (unsigned char)(color>>5)); // BGCR0
WiredHome 19:3f82c1161fd2 1333 WriteCommand(0x62, (unsigned char)(color)); // BGCR0
WiredHome 19:3f82c1161fd2 1334 return noerror;
WiredHome 19:3f82c1161fd2 1335 }
WiredHome 19:3f82c1161fd2 1336
WiredHome 44:207594dece70 1337
WiredHome 19:3f82c1161fd2 1338 RetCode_t RA8875::background(unsigned char r, unsigned char g, unsigned char b)
WiredHome 19:3f82c1161fd2 1339 {
WiredHome 37:f19b7e7449dc 1340 background(RGB(r,g,b));
WiredHome 37:f19b7e7449dc 1341 // WriteCommand(0x60, r);
WiredHome 37:f19b7e7449dc 1342 // WriteCommand(0x61, g);
WiredHome 37:f19b7e7449dc 1343 // WriteCommand(0x62, b);
WiredHome 19:3f82c1161fd2 1344 return noerror;
WiredHome 19:3f82c1161fd2 1345 }
WiredHome 19:3f82c1161fd2 1346
WiredHome 44:207594dece70 1347
WiredHome 19:3f82c1161fd2 1348 RetCode_t RA8875::foreground(color_t color)
WiredHome 19:3f82c1161fd2 1349 {
WiredHome 37:f19b7e7449dc 1350 GraphicsDisplay::foreground(color);
WiredHome 19:3f82c1161fd2 1351 WriteCommand(0x63, (unsigned char)(color>>11));
WiredHome 19:3f82c1161fd2 1352 WriteCommand(0x64, (unsigned char)(color>>5));
WiredHome 19:3f82c1161fd2 1353 WriteCommand(0x65, (unsigned char)(color));
WiredHome 19:3f82c1161fd2 1354 return noerror;
WiredHome 19:3f82c1161fd2 1355 }
WiredHome 19:3f82c1161fd2 1356
WiredHome 44:207594dece70 1357
WiredHome 37:f19b7e7449dc 1358 RetCode_t RA8875::foreground(unsigned char r, unsigned char g, unsigned char b)
WiredHome 19:3f82c1161fd2 1359 {
WiredHome 37:f19b7e7449dc 1360 foreground(RGB(r,g,b));
WiredHome 37:f19b7e7449dc 1361 // WriteCommand(0x63, r);
WiredHome 37:f19b7e7449dc 1362 // WriteCommand(0x64, g);
WiredHome 37:f19b7e7449dc 1363 // WriteCommand(0x65, b);
WiredHome 19:3f82c1161fd2 1364 return noerror;
WiredHome 19:3f82c1161fd2 1365 }
WiredHome 19:3f82c1161fd2 1366
WiredHome 44:207594dece70 1367
WiredHome 37:f19b7e7449dc 1368 color_t RA8875::GetForeColor(void)
WiredHome 19:3f82c1161fd2 1369 {
WiredHome 19:3f82c1161fd2 1370 color_t color;
WiredHome 73:f22a18707b5e 1371
WiredHome 19:3f82c1161fd2 1372 color = (ReadCommand(0x63) & 0x1F) << 11;
WiredHome 19:3f82c1161fd2 1373 color |= (ReadCommand(0x64) & 0x3F) << 5;
WiredHome 19:3f82c1161fd2 1374 color |= (ReadCommand(0x65) & 0x1F);
WiredHome 19:3f82c1161fd2 1375 return color;
WiredHome 19:3f82c1161fd2 1376 }
WiredHome 19:3f82c1161fd2 1377
WiredHome 44:207594dece70 1378
WiredHome 19:3f82c1161fd2 1379 color_t RA8875::DOSColor(int i)
WiredHome 73:f22a18707b5e 1380 {
WiredHome 73:f22a18707b5e 1381 const color_t colors[16] = {
WiredHome 19:3f82c1161fd2 1382 Black, Blue, Green, Cyan,
WiredHome 19:3f82c1161fd2 1383 Red, Magenta, Brown, Gray,
WiredHome 19:3f82c1161fd2 1384 Charcoal, BrightBlue, BrightGreen, BrightCyan,
WiredHome 19:3f82c1161fd2 1385 Orange, Pink, Yellow, White
WiredHome 73:f22a18707b5e 1386 };
WiredHome 19:3f82c1161fd2 1387 if (i < 16)
WiredHome 19:3f82c1161fd2 1388 return colors[i];
WiredHome 19:3f82c1161fd2 1389 else
WiredHome 19:3f82c1161fd2 1390 return 0;
WiredHome 73:f22a18707b5e 1391 }
WiredHome 19:3f82c1161fd2 1392
WiredHome 44:207594dece70 1393
WiredHome 73:f22a18707b5e 1394 const char * RA8875::DOSColorNames(int i)
WiredHome 73:f22a18707b5e 1395 {
WiredHome 73:f22a18707b5e 1396 const char * names[16] = {
WiredHome 19:3f82c1161fd2 1397 "Black", "Blue", "Green", "Cyan",
WiredHome 19:3f82c1161fd2 1398 "Red", "Magenta", "Brown", "Gray",
WiredHome 19:3f82c1161fd2 1399 "Charcoal", "BrightBlue", "BrightGreen", "BrightCyan",
WiredHome 19:3f82c1161fd2 1400 "Orange", "Pink", "Yellow", "White"
WiredHome 73:f22a18707b5e 1401 };
WiredHome 19:3f82c1161fd2 1402 if (i < 16)
WiredHome 19:3f82c1161fd2 1403 return names[i];
WiredHome 19:3f82c1161fd2 1404 else
WiredHome 19:3f82c1161fd2 1405 return NULL;
WiredHome 73:f22a18707b5e 1406 }
WiredHome 19:3f82c1161fd2 1407
WiredHome 19:3f82c1161fd2 1408
WiredHome 19:3f82c1161fd2 1409 ///////////////////////////////////////////////////////////////
WiredHome 19:3f82c1161fd2 1410 // Private functions
WiredHome 19:3f82c1161fd2 1411
WiredHome 79:544eb4964795 1412 unsigned char RA8875::_spiwrite(unsigned char data)
WiredHome 19:3f82c1161fd2 1413 {
WiredHome 19:3f82c1161fd2 1414 unsigned char retval;
WiredHome 73:f22a18707b5e 1415
WiredHome 68:ab08efabfc88 1416 if (!spiWriteSpeed)
WiredHome 68:ab08efabfc88 1417 _setWriteSpeed(true);
WiredHome 19:3f82c1161fd2 1418 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 1419 return retval;
WiredHome 19:3f82c1161fd2 1420 }
WiredHome 19:3f82c1161fd2 1421
WiredHome 44:207594dece70 1422
WiredHome 79:544eb4964795 1423 unsigned char RA8875::_spiread(void)
WiredHome 19:3f82c1161fd2 1424 {
WiredHome 19:3f82c1161fd2 1425 unsigned char retval;
WiredHome 19:3f82c1161fd2 1426 unsigned char data = 0;
WiredHome 73:f22a18707b5e 1427
WiredHome 68:ab08efabfc88 1428 if (spiWriteSpeed)
WiredHome 68:ab08efabfc88 1429 _setWriteSpeed(false);
WiredHome 19:3f82c1161fd2 1430 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 1431 return retval;
WiredHome 19:3f82c1161fd2 1432 }
WiredHome 19:3f82c1161fd2 1433
WiredHome 44:207594dece70 1434
WiredHome 79:544eb4964795 1435 RetCode_t RA8875::_select(bool chipsel)
WiredHome 19:3f82c1161fd2 1436 {
WiredHome 19:3f82c1161fd2 1437 cs = (chipsel == true) ? 0 : 1;
WiredHome 19:3f82c1161fd2 1438 return noerror;
WiredHome 19:3f82c1161fd2 1439 }
WiredHome 19:3f82c1161fd2 1440
WiredHome 44:207594dece70 1441
WiredHome 72:ecffe56af969 1442 RetCode_t RA8875::PrintScreen(uint16_t layer, loc_t x, loc_t y, dim_t w, dim_t h, const char *Name_BMP)
WiredHome 72:ecffe56af969 1443 {
WiredHome 77:9206c13aa527 1444 #if 1
WiredHome 74:686faa218914 1445 (void)layer;
WiredHome 74:686faa218914 1446 return PrintScreen(x, y, w, h, Name_BMP);
WiredHome 77:9206c13aa527 1447 #else
WiredHome 74:686faa218914 1448 // This is the deprecated interface and with the changes it is no longer implemented correctly.
WiredHome 72:ecffe56af969 1449 uint16_t curLayer = GetDrawingLayer();
WiredHome 72:ecffe56af969 1450 RetCode_t ret = SelectDrawingLayer(layer);
WiredHome 72:ecffe56af969 1451 if (ret == noerror) {
WiredHome 72:ecffe56af969 1452 ret = PrintScreen(x, y, w, h, Name_BMP);
WiredHome 72:ecffe56af969 1453 }
WiredHome 72:ecffe56af969 1454 SelectDrawingLayer(curLayer);
WiredHome 72:ecffe56af969 1455 return ret;
WiredHome 77:9206c13aa527 1456 #endif
WiredHome 72:ecffe56af969 1457 }
WiredHome 72:ecffe56af969 1458
WiredHome 79:544eb4964795 1459
WiredHome 72:ecffe56af969 1460 RetCode_t RA8875::PrintScreen(loc_t x, loc_t y, dim_t w, dim_t h, const char *Name_BMP)
WiredHome 72:ecffe56af969 1461 {
WiredHome 72:ecffe56af969 1462 BITMAPFILEHEADER BMP_Header;
WiredHome 72:ecffe56af969 1463 BITMAPINFOHEADER BMP_Info;
WiredHome 73:f22a18707b5e 1464
WiredHome 72:ecffe56af969 1465 INFO("(%d,%d) - (%d,%d) %s", x,y,w,h,Name_BMP);
WiredHome 72:ecffe56af969 1466 if (x >= 0 && x < width()
WiredHome 73:f22a18707b5e 1467 && y >= 0 && y < height()
WiredHome 73:f22a18707b5e 1468 && w > 0 && x + w <= width()
WiredHome 73:f22a18707b5e 1469 && h > 0 && y + h <= height()) {
WiredHome 72:ecffe56af969 1470
WiredHome 72:ecffe56af969 1471 BMP_Header.bfType = BF_TYPE;
WiredHome 72:ecffe56af969 1472 BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
WiredHome 72:ecffe56af969 1473 BMP_Header.bfReserved1 = 0;
WiredHome 72:ecffe56af969 1474 BMP_Header.bfReserved2 = 0;
WiredHome 72:ecffe56af969 1475 BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Header);
WiredHome 73:f22a18707b5e 1476
WiredHome 72:ecffe56af969 1477 BMP_Info.biSize = sizeof(BMP_Info);
WiredHome 72:ecffe56af969 1478 BMP_Info.biWidth = w;
WiredHome 72:ecffe56af969 1479 BMP_Info.biHeight = h;
WiredHome 72:ecffe56af969 1480 BMP_Info.biPlanes = 1;
WiredHome 72:ecffe56af969 1481 BMP_Info.biBitCount = 24;
WiredHome 72:ecffe56af969 1482 BMP_Info.biCompression = BI_RGB;
WiredHome 72:ecffe56af969 1483 BMP_Info.biSizeImage = 0;
WiredHome 72:ecffe56af969 1484 BMP_Info.biXPelsPerMeter = 0;
WiredHome 72:ecffe56af969 1485 BMP_Info.biYPelsPerMeter = 0;
WiredHome 72:ecffe56af969 1486 BMP_Info.biClrUsed = 0;
WiredHome 72:ecffe56af969 1487 BMP_Info.biClrImportant = 0;
WiredHome 72:ecffe56af969 1488
WiredHome 72:ecffe56af969 1489 INFO("Writing {%s}", Name_BMP);
WiredHome 72:ecffe56af969 1490 FILE *Image = fopen(Name_BMP, "wb");
WiredHome 72:ecffe56af969 1491 if (!Image) {
WiredHome 72:ecffe56af969 1492 ERR("File not found");
WiredHome 72:ecffe56af969 1493 return(file_not_found);
WiredHome 72:ecffe56af969 1494 }
WiredHome 72:ecffe56af969 1495
WiredHome 72:ecffe56af969 1496 // Be optimistic - don't check for errors.
WiredHome 72:ecffe56af969 1497 //HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
WiredHome 72:ecffe56af969 1498 fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
WiredHome 72:ecffe56af969 1499 //INFO("fwrite returned %d", r);
WiredHome 73:f22a18707b5e 1500
WiredHome 72:ecffe56af969 1501 //HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
WiredHome 72:ecffe56af969 1502 fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
WiredHome 72:ecffe56af969 1503 //INFO("fwrite returned %d", r);
WiredHome 73:f22a18707b5e 1504
WiredHome 72:ecffe56af969 1505 int lineBufSize = ((24 * w + 7)/8);
WiredHome 72:ecffe56af969 1506 uint8_t * lineBuffer = (uint8_t *)malloc(lineBufSize);
WiredHome 72:ecffe56af969 1507 if (lineBuffer == NULL) {
WiredHome 72:ecffe56af969 1508 fclose(Image);
WiredHome 72:ecffe56af969 1509 ERR("Not enough RAM for lineBuffer");
WiredHome 72:ecffe56af969 1510 return(not_enough_ram);
WiredHome 72:ecffe56af969 1511 }
WiredHome 72:ecffe56af969 1512 color_t * pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
WiredHome 73:f22a18707b5e 1513 color_t * pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
WiredHome 73:f22a18707b5e 1514 color_t transparency = GetBackgroundTransparencyColor();
WiredHome 73:f22a18707b5e 1515 unsigned char ltpr0 = ReadCommand(0x52) & 0x7;
WiredHome 73:f22a18707b5e 1516
WiredHome 73:f22a18707b5e 1517 if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
WiredHome 72:ecffe56af969 1518 fclose(Image);
WiredHome 72:ecffe56af969 1519 free(lineBuffer);
WiredHome 72:ecffe56af969 1520 ERR("Not enough RAM for pixelBuffer");
WiredHome 73:f22a18707b5e 1521 if (pixelBuffer)
WiredHome 73:f22a18707b5e 1522 free(pixelBuffer);
WiredHome 72:ecffe56af969 1523 return(not_enough_ram);
WiredHome 72:ecffe56af969 1524 }
WiredHome 73:f22a18707b5e 1525
WiredHome 73:f22a18707b5e 1526 uint16_t prevLayer = GetDrawingLayer();
WiredHome 73:f22a18707b5e 1527 // If only one of the layers is visible, select that layer
WiredHome 73:f22a18707b5e 1528 switch(ltpr0) {
WiredHome 73:f22a18707b5e 1529 case 0:
WiredHome 73:f22a18707b5e 1530 SelectDrawingLayer(0);
WiredHome 73:f22a18707b5e 1531 break;
WiredHome 73:f22a18707b5e 1532 case 1:
WiredHome 73:f22a18707b5e 1533 SelectDrawingLayer(1);
WiredHome 73:f22a18707b5e 1534 break;
WiredHome 73:f22a18707b5e 1535 default:
WiredHome 73:f22a18707b5e 1536 break;
WiredHome 73:f22a18707b5e 1537 }
WiredHome 73:f22a18707b5e 1538
WiredHome 72:ecffe56af969 1539 // Read the display from the last line toward the top
WiredHome 72:ecffe56af969 1540 // so we can write the file in one pass.
WiredHome 72:ecffe56af969 1541 for (int j = h - 1; j >= 0; j--) {
WiredHome 73:f22a18707b5e 1542 if (ltpr0 >= 2) // Need to combine the layers...
WiredHome 73:f22a18707b5e 1543 SelectDrawingLayer(0); // so read layer 0 first
WiredHome 72:ecffe56af969 1544 // Read one line of pixels to a local buffer
WiredHome 72:ecffe56af969 1545 if (getPixelStream(pixelBuffer, w, x,y+j) != noerror) {
WiredHome 72:ecffe56af969 1546 ERR("getPixelStream error, and no recovery handler...");
WiredHome 72:ecffe56af969 1547 }
WiredHome 73:f22a18707b5e 1548 if (ltpr0 >= 2) { // Need to combine the layers...
WiredHome 73:f22a18707b5e 1549 SelectDrawingLayer(1); // so read layer 0 first
WiredHome 73:f22a18707b5e 1550 if (getPixelStream(pixelBuffer2, w, x,y+j) != noerror) {
WiredHome 73:f22a18707b5e 1551 ERR("getPixelStream error, and no recovery handler...");
WiredHome 73:f22a18707b5e 1552 }
WiredHome 73:f22a18707b5e 1553 }
WiredHome 72:ecffe56af969 1554 // Convert the local buffer to RGBQUAD format
WiredHome 72:ecffe56af969 1555 int lb = 0;
WiredHome 72:ecffe56af969 1556 for (int i=0; i<w; i++) {
WiredHome 73:f22a18707b5e 1557 RGBQUAD q0 = RGB16ToRGBQuad(pixelBuffer[x+i]); // Scale to 24-bits
WiredHome 73:f22a18707b5e 1558 RGBQUAD q1 = RGB16ToRGBQuad(pixelBuffer2[x+i]); // Scale to 24-bits
WiredHome 73:f22a18707b5e 1559 switch (ltpr0) {
WiredHome 73:f22a18707b5e 1560 case 0:
WiredHome 73:f22a18707b5e 1561 case 1:
WiredHome 73:f22a18707b5e 1562 case 2: // lighten-overlay (@TODO Not supported yet)
WiredHome 73:f22a18707b5e 1563 case 6: // Floating Windows (@TODO not sure how to support)
WiredHome 73:f22a18707b5e 1564 default: // Reserved...
WiredHome 73:f22a18707b5e 1565 lineBuffer[lb++] = q0.rgbBlue;
WiredHome 73:f22a18707b5e 1566 lineBuffer[lb++] = q0.rgbGreen;
WiredHome 73:f22a18707b5e 1567 lineBuffer[lb++] = q0.rgbRed;
WiredHome 73:f22a18707b5e 1568 break;
WiredHome 73:f22a18707b5e 1569 case 3: // transparent mode (@TODO Read the background color register for transparent)
WiredHome 73:f22a18707b5e 1570 case 4: // boolean or
WiredHome 73:f22a18707b5e 1571 lineBuffer[lb++] = q0.rgbBlue | q1.rgbBlue;
WiredHome 73:f22a18707b5e 1572 lineBuffer[lb++] = q0.rgbGreen | q1.rgbGreen;
WiredHome 73:f22a18707b5e 1573 lineBuffer[lb++] = q0.rgbRed | q1.rgbRed;
WiredHome 73:f22a18707b5e 1574 break;
WiredHome 73:f22a18707b5e 1575 case 5: // boolean AND
WiredHome 73:f22a18707b5e 1576 lineBuffer[lb++] = q0.rgbBlue & q1.rgbBlue;
WiredHome 73:f22a18707b5e 1577 lineBuffer[lb++] = q0.rgbGreen & q1.rgbGreen;
WiredHome 73:f22a18707b5e 1578 lineBuffer[lb++] = q0.rgbRed & q1.rgbRed;
WiredHome 73:f22a18707b5e 1579 break;
WiredHome 73:f22a18707b5e 1580 }
WiredHome 72:ecffe56af969 1581 }
WiredHome 73:f22a18707b5e 1582 if (j == h - 1)
WiredHome 73:f22a18707b5e 1583 HexDump("Line", lineBuffer, lineBufSize);
WiredHome 72:ecffe56af969 1584 // Write to disk
WiredHome 72:ecffe56af969 1585 fwrite(lineBuffer, sizeof(char), lb, Image);
WiredHome 72:ecffe56af969 1586 }
WiredHome 73:f22a18707b5e 1587 SelectDrawingLayer(prevLayer);
WiredHome 72:ecffe56af969 1588 fclose(Image);
WiredHome 73:f22a18707b5e 1589 free(pixelBuffer2); // don't leak memory.
WiredHome 73:f22a18707b5e 1590 free(pixelBuffer);
WiredHome 72:ecffe56af969 1591 free(lineBuffer);
WiredHome 73:f22a18707b5e 1592 INFO("Image closed");
WiredHome 72:ecffe56af969 1593 return noerror;
WiredHome 72:ecffe56af969 1594 } else {
WiredHome 72:ecffe56af969 1595 return bad_parameter;
WiredHome 72:ecffe56af969 1596 }
WiredHome 72:ecffe56af969 1597 }
WiredHome 72:ecffe56af969 1598
WiredHome 72:ecffe56af969 1599
WiredHome 72:ecffe56af969 1600 // ##########################################################################
WiredHome 72:ecffe56af969 1601 // ##########################################################################
WiredHome 72:ecffe56af969 1602 // ##########################################################################
WiredHome 72:ecffe56af969 1603
WiredHome 23:a50ded45dbaf 1604 #ifdef TESTENABLE
WiredHome 23:a50ded45dbaf 1605
WiredHome 37:f19b7e7449dc 1606 #include "Arial12x12.h"
WiredHome 37:f19b7e7449dc 1607 #include "Small_6.h"
WiredHome 37:f19b7e7449dc 1608
WiredHome 23:a50ded45dbaf 1609 // ______________ ______________ ______________ _______________
WiredHome 23:a50ded45dbaf 1610 // /_____ _____/ / ___________/ / ___________/ /_____ ______/
WiredHome 23:a50ded45dbaf 1611 // / / / / / / / /
WiredHome 23:a50ded45dbaf 1612 // / / / /___ / /__________ / /
WiredHome 23:a50ded45dbaf 1613 // / / / ____/ /__________ / / /
WiredHome 23:a50ded45dbaf 1614 // / / / / / / / /
WiredHome 23:a50ded45dbaf 1615 // / / / /__________ ___________/ / / /
WiredHome 23:a50ded45dbaf 1616 // /__/ /_____________/ /_____________/ /__/
WiredHome 23:a50ded45dbaf 1617 //
WiredHome 23:a50ded45dbaf 1618 // Everything from here down is test code.
WiredHome 75:ca78388cfd77 1619 //
WiredHome 41:2956a0a221e5 1620 bool SuppressSlowStuff = false;
WiredHome 23:a50ded45dbaf 1621
WiredHome 49:c5182231d1b9 1622 void TextWrapTest(RA8875 & display, Serial & pc)
WiredHome 49:c5182231d1b9 1623 {
WiredHome 49:c5182231d1b9 1624 if (!SuppressSlowStuff)
WiredHome 49:c5182231d1b9 1625 pc.printf("Text Wrap Test\r\n");
WiredHome 49:c5182231d1b9 1626 display.background(Black);
WiredHome 49:c5182231d1b9 1627 display.foreground(Blue);
WiredHome 49:c5182231d1b9 1628 display.cls();
WiredHome 49:c5182231d1b9 1629 display.Backlight_u8(255);
WiredHome 49:c5182231d1b9 1630 display.puts(0,0, "Text Wrap Test.\r\n");
WiredHome 52:e6039a823420 1631 for (int i=1; i<60; i++) {
WiredHome 52:e6039a823420 1632 display.printf("L%2d\n", i % 17);
WiredHome 49:c5182231d1b9 1633 if (!SuppressSlowStuff)
WiredHome 52:e6039a823420 1634 wait_ms(100);
WiredHome 49:c5182231d1b9 1635 }
WiredHome 49:c5182231d1b9 1636 if (!SuppressSlowStuff)
WiredHome 49:c5182231d1b9 1637 wait_ms(3000);
WiredHome 49:c5182231d1b9 1638 }
WiredHome 49:c5182231d1b9 1639
WiredHome 75:ca78388cfd77 1640
WiredHome 75:ca78388cfd77 1641 void ShowKey(RA8875 & display, int key)
WiredHome 75:ca78388cfd77 1642 {
WiredHome 75:ca78388cfd77 1643 loc_t col, row;
WiredHome 75:ca78388cfd77 1644 dim_t r1 = 25;
WiredHome 75:ca78388cfd77 1645 color_t color = (key & 0x80) ? Red : Green;
WiredHome 75:ca78388cfd77 1646
WiredHome 75:ca78388cfd77 1647 key &= 0x7F; // remove the long-press flag
WiredHome 75:ca78388cfd77 1648 row = (key - 1) / 5;
WiredHome 75:ca78388cfd77 1649 col = (key - 1) % 5;
WiredHome 75:ca78388cfd77 1650 if (col > 5) col = 5;
WiredHome 75:ca78388cfd77 1651 if (row > 4) row = 4;
WiredHome 75:ca78388cfd77 1652 display.circle(450 - + (2 * r1) * col, 200 - (2 * r1) * row, r1-2, color, FILL);
WiredHome 75:ca78388cfd77 1653 }
WiredHome 75:ca78388cfd77 1654
WiredHome 75:ca78388cfd77 1655 void HideKey(RA8875 & display, int key)
WiredHome 75:ca78388cfd77 1656 {
WiredHome 75:ca78388cfd77 1657 loc_t col, row;
WiredHome 75:ca78388cfd77 1658 dim_t r1 = 25;
WiredHome 75:ca78388cfd77 1659
WiredHome 75:ca78388cfd77 1660 row = (key - 1) / 5;
WiredHome 75:ca78388cfd77 1661 col = (key - 1) % 5;
WiredHome 75:ca78388cfd77 1662 if (col > 5) col = 5;
WiredHome 75:ca78388cfd77 1663 if (row > 4) row = 4;
WiredHome 75:ca78388cfd77 1664 display.background(Black);
WiredHome 75:ca78388cfd77 1665 display.circle(450 - (2 * r1) * col, 200 - (2 * r1) * row, r1-2, Black, FILL);
WiredHome 75:ca78388cfd77 1666 display.circle(450 - (2 * r1) * col, 200 - (2 * r1) * row, r1-2, Blue);
WiredHome 75:ca78388cfd77 1667 }
WiredHome 75:ca78388cfd77 1668
WiredHome 75:ca78388cfd77 1669 void KeyPadTest(RA8875 & display, Serial & pc)
WiredHome 75:ca78388cfd77 1670 {
WiredHome 75:ca78388cfd77 1671 const uint8_t myMap[22] = {
WiredHome 77:9206c13aa527 1672 0,
WiredHome 75:ca78388cfd77 1673 'a', 'b', 'c', 'd', 'e',
WiredHome 75:ca78388cfd77 1674 'f', 'g', 'h', 'i', 'j',
WiredHome 75:ca78388cfd77 1675 'k', 'l', 'm', 'n', 'o',
WiredHome 75:ca78388cfd77 1676 'p', 'q', 'r', 's', 't',
WiredHome 75:ca78388cfd77 1677 'x'
WiredHome 75:ca78388cfd77 1678 };
WiredHome 77:9206c13aa527 1679
WiredHome 75:ca78388cfd77 1680 display.background(Black);
WiredHome 75:ca78388cfd77 1681 display.foreground(Blue);
WiredHome 75:ca78388cfd77 1682 display.cls();
WiredHome 75:ca78388cfd77 1683 display.Backlight_u8(255);
WiredHome 75:ca78388cfd77 1684 display.puts(0,0, "KeyPad Test. Touch the keypad...");
WiredHome 75:ca78388cfd77 1685 pc.printf("\r\n"
WiredHome 75:ca78388cfd77 1686 "Raw KeyPad Test. Keypad returns the key-number.\r\n"
WiredHome 75:ca78388cfd77 1687 "Press [most] any PC keyboard key to advance to next test.\r\n");
WiredHome 75:ca78388cfd77 1688 RetCode_t ret = display.KeypadInit(true, true, 3, 7, 3);
WiredHome 75:ca78388cfd77 1689 if (ret != noerror)
WiredHome 75:ca78388cfd77 1690 pc.printf("returncode from KeypadInit is %d\r\n", ret);
WiredHome 75:ca78388cfd77 1691 int lastKey = 0;
WiredHome 75:ca78388cfd77 1692 while (!pc.readable()) {
WiredHome 75:ca78388cfd77 1693 if (display.readable()) {
WiredHome 75:ca78388cfd77 1694 int key = display.getc();
WiredHome 75:ca78388cfd77 1695 if (key) {
WiredHome 75:ca78388cfd77 1696 if (((key & 0x7F) != lastKey) && (lastKey != 0))
WiredHome 75:ca78388cfd77 1697 HideKey(display, lastKey);
WiredHome 75:ca78388cfd77 1698 ShowKey(display, key);
WiredHome 75:ca78388cfd77 1699 lastKey = key & 0x7F;
WiredHome 75:ca78388cfd77 1700 } else {
WiredHome 75:ca78388cfd77 1701 // erase the last one
WiredHome 75:ca78388cfd77 1702 if (lastKey)
WiredHome 75:ca78388cfd77 1703 HideKey(display, lastKey);
WiredHome 75:ca78388cfd77 1704 }
WiredHome 75:ca78388cfd77 1705 }
WiredHome 75:ca78388cfd77 1706 }
WiredHome 75:ca78388cfd77 1707 (void)pc.getc();
WiredHome 75:ca78388cfd77 1708 pc.printf("\r\n"
WiredHome 75:ca78388cfd77 1709 "Map KeyPad Test. Keypad returns the remapped key 'a' - 't'.\r\n"
WiredHome 75:ca78388cfd77 1710 "Press [most] any PC keyboard key to advance to exit test.\r\n");
WiredHome 75:ca78388cfd77 1711 display.SetKeyMap(myMap);
WiredHome 75:ca78388cfd77 1712 while (!pc.readable()) {
WiredHome 75:ca78388cfd77 1713 if (display.readable()) {
WiredHome 75:ca78388cfd77 1714 int key = display.getc();
WiredHome 75:ca78388cfd77 1715 bool longPress = key & 0x80;
WiredHome 75:ca78388cfd77 1716 display.SetTextCursor(0, 120);
WiredHome 75:ca78388cfd77 1717 display.printf("Long Press: %d\r\n", longPress);
WiredHome 75:ca78388cfd77 1718 display.printf(" Remapped: %c %02X\r\n", (key) ? key & 0x7F : ' ', key);
WiredHome 75:ca78388cfd77 1719 }
WiredHome 75:ca78388cfd77 1720 }
WiredHome 75:ca78388cfd77 1721 (void)pc.getc();
WiredHome 75:ca78388cfd77 1722 display.SetKeyMap();
WiredHome 75:ca78388cfd77 1723 pc.printf("\r\n");
WiredHome 75:ca78388cfd77 1724 }
WiredHome 75:ca78388cfd77 1725
WiredHome 23:a50ded45dbaf 1726 void TextCursorTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1727 {
WiredHome 75:ca78388cfd77 1728 const char * iCursor = "The I-Beam cursor should be visible for this text.\r\n";
WiredHome 75:ca78388cfd77 1729 const char * uCursor = "The Underscore cursor should be visible for this text.\r\n";
WiredHome 75:ca78388cfd77 1730 const char * bCursor = "The Block cursor should be visible for this text.\r\n";
WiredHome 37:f19b7e7449dc 1731 const char * bbCursor = "The Blinking Block cursor should be visible for this text.\r\n";
WiredHome 23:a50ded45dbaf 1732 const char * p;
WiredHome 41:2956a0a221e5 1733 int delay = 100;
WiredHome 73:f22a18707b5e 1734
WiredHome 41:2956a0a221e5 1735 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1736 pc.printf("Text Cursor Test\r\n");
WiredHome 73:f22a18707b5e 1737 else
WiredHome 41:2956a0a221e5 1738 delay = 0;
WiredHome 23:a50ded45dbaf 1739 display.background(Black);
WiredHome 23:a50ded45dbaf 1740 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1741 display.cls();
WiredHome 25:9556a3a9b7cc 1742 display.Backlight_u8(255);
WiredHome 23:a50ded45dbaf 1743 display.puts(0,0, "Text Cursor Test.");
WiredHome 73:f22a18707b5e 1744
WiredHome 23:a50ded45dbaf 1745 // visible, non-blinking
WiredHome 24:8ca861acf12d 1746 display.SetTextCursor(0,20);
WiredHome 53:86d24b9480b9 1747 display.SetTextCursorControl(RA8875::IBEAM, false);
WiredHome 24:8ca861acf12d 1748 p = iCursor;
WiredHome 23:a50ded45dbaf 1749 while (*p) {
WiredHome 24:8ca861acf12d 1750 display._putc(*p++);
WiredHome 41:2956a0a221e5 1751 wait_ms(delay);
WiredHome 24:8ca861acf12d 1752 }
WiredHome 24:8ca861acf12d 1753
WiredHome 53:86d24b9480b9 1754 display.SetTextCursorControl(RA8875::UNDER, false);
WiredHome 24:8ca861acf12d 1755 p = uCursor;
WiredHome 24:8ca861acf12d 1756 while (*p) {
WiredHome 24:8ca861acf12d 1757 display._putc(*p++);
WiredHome 41:2956a0a221e5 1758 wait_ms(delay);
WiredHome 23:a50ded45dbaf 1759 }
WiredHome 73:f22a18707b5e 1760
WiredHome 53:86d24b9480b9 1761 display.SetTextCursorControl(RA8875::BLOCK, false);
WiredHome 24:8ca861acf12d 1762 p = bCursor;
WiredHome 24:8ca861acf12d 1763 while (*p) {
WiredHome 24:8ca861acf12d 1764 display._putc(*p++);
WiredHome 41:2956a0a221e5 1765 wait_ms(delay);
WiredHome 24:8ca861acf12d 1766 }
WiredHome 24:8ca861acf12d 1767
WiredHome 53:86d24b9480b9 1768 display.SetTextCursorControl(RA8875::BLOCK, true);
WiredHome 24:8ca861acf12d 1769 p = bbCursor;
WiredHome 24:8ca861acf12d 1770 while (*p) {
WiredHome 24:8ca861acf12d 1771 display._putc(*p++);
WiredHome 41:2956a0a221e5 1772 wait_ms(delay);
WiredHome 24:8ca861acf12d 1773 }
WiredHome 41:2956a0a221e5 1774 wait_ms(delay * 20);
WiredHome 53:86d24b9480b9 1775 display.SetTextCursorControl(RA8875::NOCURSOR, false);
WiredHome 23:a50ded45dbaf 1776 }
WiredHome 23:a50ded45dbaf 1777
WiredHome 44:207594dece70 1778
WiredHome 23:a50ded45dbaf 1779 void BacklightTest(RA8875 & display, Serial & pc, float ramptime)
WiredHome 23:a50ded45dbaf 1780 {
WiredHome 29:422616aa04bd 1781 char buf[60];
WiredHome 41:2956a0a221e5 1782 unsigned int w = (ramptime * 1000)/ 256;
WiredHome 41:2956a0a221e5 1783 int delay = 200;
WiredHome 41:2956a0a221e5 1784
WiredHome 41:2956a0a221e5 1785 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1786 pc.printf("Backlight Test - ramp over %f sec.\r\n", ramptime);
WiredHome 41:2956a0a221e5 1787 else {
WiredHome 41:2956a0a221e5 1788 delay = 0;
WiredHome 41:2956a0a221e5 1789 w = 0;
WiredHome 41:2956a0a221e5 1790 }
WiredHome 23:a50ded45dbaf 1791 display.Backlight_u8(0);
WiredHome 29:422616aa04bd 1792 display.background(White);
WiredHome 23:a50ded45dbaf 1793 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1794 display.cls();
WiredHome 41:2956a0a221e5 1795 wait_ms(delay);
WiredHome 23:a50ded45dbaf 1796 display.puts(0,0, "RA8875 Backlight Test - Ramp up.");
WiredHome 38:38d503b4fad6 1797 for (int i=0; i <= 255; i++) {
WiredHome 29:422616aa04bd 1798 sprintf(buf, "%3d, %4d", i, w);
WiredHome 37:f19b7e7449dc 1799 display.puts(100,100,buf);
WiredHome 23:a50ded45dbaf 1800 display.Backlight_u8(i);
WiredHome 29:422616aa04bd 1801 wait_ms(w);
WiredHome 23:a50ded45dbaf 1802 }
WiredHome 23:a50ded45dbaf 1803 }
WiredHome 23:a50ded45dbaf 1804
WiredHome 44:207594dece70 1805
WiredHome 23:a50ded45dbaf 1806 void BacklightTest2(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1807 {
WiredHome 41:2956a0a221e5 1808 int delay = 20;
WiredHome 41:2956a0a221e5 1809
WiredHome 41:2956a0a221e5 1810 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1811 pc.printf("Backlight Test 2\r\n");
WiredHome 41:2956a0a221e5 1812 else
WiredHome 41:2956a0a221e5 1813 delay = 0;
WiredHome 41:2956a0a221e5 1814
WiredHome 23:a50ded45dbaf 1815 // Dim it out at the end of the tests.
WiredHome 37:f19b7e7449dc 1816 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1817 display.puts(0,0, "Ramp Backlight down.");
WiredHome 23:a50ded45dbaf 1818 // Ramp it off
WiredHome 23:a50ded45dbaf 1819 for (int i=255; i != 0; i--) {
WiredHome 23:a50ded45dbaf 1820 display.Backlight_u8(i);
WiredHome 41:2956a0a221e5 1821 wait_ms(delay);
WiredHome 23:a50ded45dbaf 1822 }
WiredHome 23:a50ded45dbaf 1823 display.Backlight_u8(0);
WiredHome 23:a50ded45dbaf 1824 }
WiredHome 23:a50ded45dbaf 1825
WiredHome 44:207594dece70 1826
WiredHome 23:a50ded45dbaf 1827 void ExternalFontTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1828 {
WiredHome 41:2956a0a221e5 1829 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1830 pc.printf("External Font Test\r\n");
WiredHome 23:a50ded45dbaf 1831 display.background(Black);
WiredHome 23:a50ded45dbaf 1832 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1833 display.cls();
WiredHome 23:a50ded45dbaf 1834 display.Backlight(1);
WiredHome 37:f19b7e7449dc 1835 display.puts(0,0, "External Font Test.");
WiredHome 37:f19b7e7449dc 1836
WiredHome 37:f19b7e7449dc 1837 display.set_font(Small_6);
WiredHome 73:f22a18707b5e 1838 display.puts(0,30, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
WiredHome 37:f19b7e7449dc 1839
WiredHome 23:a50ded45dbaf 1840 display.set_font(Arial12x12);
WiredHome 37:f19b7e7449dc 1841 display.puts("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
WiredHome 37:f19b7e7449dc 1842 display.set_font(); // restore to internal
WiredHome 73:f22a18707b5e 1843
WiredHome 37:f19b7e7449dc 1844 display.puts("Normal font again.");
WiredHome 37:f19b7e7449dc 1845 //display.window(0,0, display.width(), display.height());
WiredHome 23:a50ded45dbaf 1846 }
WiredHome 23:a50ded45dbaf 1847
WiredHome 44:207594dece70 1848
WiredHome 23:a50ded45dbaf 1849 void DOSColorTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1850 {
WiredHome 41:2956a0a221e5 1851 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1852 pc.printf("DOS Color Test\r\n");
WiredHome 23:a50ded45dbaf 1853 display.background(Black);
WiredHome 23:a50ded45dbaf 1854 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1855 display.cls();
WiredHome 23:a50ded45dbaf 1856 display.puts(0,0, "DOS Colors - Fore");
WiredHome 23:a50ded45dbaf 1857 display.puts(280,0, "Back");
WiredHome 23:a50ded45dbaf 1858 display.background(Gray);
WiredHome 23:a50ded45dbaf 1859 for (int i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 1860 display.foreground(display.DOSColor(i));
WiredHome 23:a50ded45dbaf 1861 display.puts(160, i*16, display.DOSColorNames(i));
WiredHome 23:a50ded45dbaf 1862 display.background(Black);
WiredHome 23:a50ded45dbaf 1863 }
WiredHome 23:a50ded45dbaf 1864 display.foreground(White);
WiredHome 23:a50ded45dbaf 1865 for (int i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 1866 display.background(display.DOSColor(i));
WiredHome 23:a50ded45dbaf 1867 display.puts(360, i*16, display.DOSColorNames(i));
WiredHome 23:a50ded45dbaf 1868 display.foreground(White);
WiredHome 23:a50ded45dbaf 1869 }
WiredHome 23:a50ded45dbaf 1870 }
WiredHome 23:a50ded45dbaf 1871
WiredHome 44:207594dece70 1872
WiredHome 23:a50ded45dbaf 1873 void WebColorTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1874 {
WiredHome 41:2956a0a221e5 1875 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1876 pc.printf("Web Color Test\r\n");
WiredHome 23:a50ded45dbaf 1877 display.background(Black);
WiredHome 23:a50ded45dbaf 1878 display.foreground(Blue);
WiredHome 32:0e4f2ae512e2 1879 display.window(0,0, display.width(), display.height());
WiredHome 23:a50ded45dbaf 1880 display.cls();
WiredHome 59:fb40aad4efd4 1881 display.SetTextFontSize(1,1);
WiredHome 59:fb40aad4efd4 1882 display.puts(200,0, "Web Color Test");
WiredHome 59:fb40aad4efd4 1883 display.SetTextCursor(0,0);
WiredHome 59:fb40aad4efd4 1884 display.puts(" ");
WiredHome 59:fb40aad4efd4 1885 for (int i=0; i<16; i++)
WiredHome 59:fb40aad4efd4 1886 display.printf("%X", i&0xF);
WiredHome 59:fb40aad4efd4 1887 display.puts("\r\n0 ");
WiredHome 23:a50ded45dbaf 1888 for (int i=0; i<sizeof(WebColors)/sizeof(WebColors[0]); i++) {
WiredHome 23:a50ded45dbaf 1889 display.background(WebColors[i]);
WiredHome 23:a50ded45dbaf 1890 display.puts(" ");
WiredHome 59:fb40aad4efd4 1891 if (i % 16 == 15 && i < 255) {
WiredHome 59:fb40aad4efd4 1892 display.printf("\r\n%X ", ((i+1)/16));
WiredHome 59:fb40aad4efd4 1893 }
WiredHome 23:a50ded45dbaf 1894 }
WiredHome 23:a50ded45dbaf 1895 display.SetTextFontSize(1,1);
WiredHome 23:a50ded45dbaf 1896 }
WiredHome 23:a50ded45dbaf 1897
WiredHome 44:207594dece70 1898
WiredHome 37:f19b7e7449dc 1899 void PixelTest(RA8875 & display, Serial & pc)
WiredHome 37:f19b7e7449dc 1900 {
WiredHome 37:f19b7e7449dc 1901 int i, c, x, y;
WiredHome 37:f19b7e7449dc 1902
WiredHome 41:2956a0a221e5 1903 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1904 pc.printf("Pixel Test\r\n");
WiredHome 37:f19b7e7449dc 1905 display.background(Black);
WiredHome 37:f19b7e7449dc 1906 display.foreground(Blue);
WiredHome 37:f19b7e7449dc 1907 display.cls();
WiredHome 37:f19b7e7449dc 1908 display.puts(0,0, "Pixel Test");
WiredHome 37:f19b7e7449dc 1909 for (i=0; i<1000; i++) {
WiredHome 37:f19b7e7449dc 1910 x = rand() % 480;
WiredHome 37:f19b7e7449dc 1911 y = 16 + rand() % (272-16);
WiredHome 37:f19b7e7449dc 1912 c = rand() % 16;
WiredHome 37:f19b7e7449dc 1913 //pc.printf(" (%d,%d) - %d\r\n", x,y,r1);
WiredHome 37:f19b7e7449dc 1914 display.pixel(x,y, display.DOSColor(c));
WiredHome 37:f19b7e7449dc 1915 }
WiredHome 37:f19b7e7449dc 1916 }
WiredHome 37:f19b7e7449dc 1917
WiredHome 44:207594dece70 1918
WiredHome 23:a50ded45dbaf 1919 void LineTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1920 {
WiredHome 23:a50ded45dbaf 1921 int i, x, y, x2, y2;
WiredHome 23:a50ded45dbaf 1922
WiredHome 41:2956a0a221e5 1923 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1924 pc.printf("Line Test\r\n");
WiredHome 23:a50ded45dbaf 1925 display.background(Black);
WiredHome 23:a50ded45dbaf 1926 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1927 display.cls();
WiredHome 23:a50ded45dbaf 1928 display.puts(0,0, "Line Test");
WiredHome 23:a50ded45dbaf 1929 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 1930 // Lines
WiredHome 23:a50ded45dbaf 1931 x = rand() % 480;
WiredHome 23:a50ded45dbaf 1932 y = rand() % 272;
WiredHome 23:a50ded45dbaf 1933 x2 = rand() % 480;
WiredHome 23:a50ded45dbaf 1934 y2 = rand() % 272;
WiredHome 23:a50ded45dbaf 1935 display.line(x,y, x2,y2, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 1936 }
WiredHome 62:ba5d33438fda 1937 display.foreground(BrightRed);
WiredHome 62:ba5d33438fda 1938 display.foreground(BrightGreen);
WiredHome 62:ba5d33438fda 1939 display.foreground(BrightBlue);
WiredHome 62:ba5d33438fda 1940 display.line(55,50, 79,74, BrightRed);
WiredHome 62:ba5d33438fda 1941 display.line(57,50, 81,74, BrightGreen);
WiredHome 62:ba5d33438fda 1942 display.line(59,50, 83,74, BrightBlue);
WiredHome 62:ba5d33438fda 1943 // horz
WiredHome 62:ba5d33438fda 1944 display.line(30,40, 32,40, BrightRed);
WiredHome 62:ba5d33438fda 1945 display.line(30,42, 32,42, BrightGreen);
WiredHome 62:ba5d33438fda 1946 display.line(30,44, 32,44, BrightBlue);
WiredHome 62:ba5d33438fda 1947 // vert
WiredHome 62:ba5d33438fda 1948 display.line(20,40, 20,42, BrightRed);
WiredHome 62:ba5d33438fda 1949 display.line(22,40, 22,42, BrightGreen);
WiredHome 62:ba5d33438fda 1950 display.line(24,40, 24,42, BrightBlue);
WiredHome 62:ba5d33438fda 1951 // compare point to line-point
WiredHome 62:ba5d33438fda 1952 display.pixel(20,50, BrightRed);
WiredHome 62:ba5d33438fda 1953 display.pixel(22,50, BrightGreen);
WiredHome 62:ba5d33438fda 1954 display.pixel(24,50, BrightBlue);
WiredHome 62:ba5d33438fda 1955 display.line(20,52, 20,52, BrightRed);
WiredHome 62:ba5d33438fda 1956 display.line(22,52, 22,52, BrightGreen);
WiredHome 62:ba5d33438fda 1957 display.line(24,52, 24,52, BrightBlue);
WiredHome 73:f22a18707b5e 1958
WiredHome 62:ba5d33438fda 1959 // point
WiredHome 62:ba5d33438fda 1960 display.line(50,50, 50,50, Red);
WiredHome 62:ba5d33438fda 1961 display.line(52,52, 52,52, Green);
WiredHome 62:ba5d33438fda 1962 display.line(54,54, 54,54, Blue);
WiredHome 62:ba5d33438fda 1963 display.line(60,60, 60,60, BrightRed);
WiredHome 62:ba5d33438fda 1964 display.line(62,62, 62,62, BrightGreen);
WiredHome 62:ba5d33438fda 1965 display.line(64,64, 64,64, BrightBlue);
WiredHome 62:ba5d33438fda 1966 display.line(70,70, 70,70, DarkRed);
WiredHome 62:ba5d33438fda 1967 display.line(72,72, 72,72, DarkGreen);
WiredHome 62:ba5d33438fda 1968 display.line(74,74, 74,74, DarkBlue);
WiredHome 23:a50ded45dbaf 1969 }
WiredHome 23:a50ded45dbaf 1970
WiredHome 44:207594dece70 1971
WiredHome 23:a50ded45dbaf 1972 void RectangleTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 1973 {
WiredHome 23:a50ded45dbaf 1974 int i, x1,y1, x2,y2;
WiredHome 23:a50ded45dbaf 1975
WiredHome 41:2956a0a221e5 1976 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 1977 pc.printf("Rectangle Test\r\n");
WiredHome 23:a50ded45dbaf 1978 display.background(Black);
WiredHome 23:a50ded45dbaf 1979 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 1980 display.cls();
WiredHome 23:a50ded45dbaf 1981 display.puts(0,0, "Rectangle Test");
WiredHome 23:a50ded45dbaf 1982 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 1983 x1 = rand() % 240;
WiredHome 23:a50ded45dbaf 1984 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 1985 x2 = rand() % 240;
WiredHome 23:a50ded45dbaf 1986 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 1987 display.rect(x1,y1, x2,y2, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 1988
WiredHome 23:a50ded45dbaf 1989 x1 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 1990 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 1991 x2 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 1992 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 1993 display.rect(x1,y1, x2,y2, FILL);
WiredHome 23:a50ded45dbaf 1994 }
WiredHome 23:a50ded45dbaf 1995 }
WiredHome 23:a50ded45dbaf 1996
WiredHome 44:207594dece70 1997
WiredHome 44:207594dece70 1998 void LayerTest(RA8875 & display, Serial & pc)
WiredHome 44:207594dece70 1999 {
WiredHome 44:207594dece70 2000 loc_t i, x1,y1, x2,y2, r1,r2;
WiredHome 44:207594dece70 2001
WiredHome 44:207594dece70 2002 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2003 pc.printf("Layer Test\r\n");
WiredHome 44:207594dece70 2004
WiredHome 50:2c4f474a2453 2005 display.SelectDrawingLayer(0);
WiredHome 44:207594dece70 2006 display.background(Black);
WiredHome 44:207594dece70 2007 display.foreground(Blue);
WiredHome 44:207594dece70 2008 display.cls();
WiredHome 44:207594dece70 2009 display.puts(0,0, "Layer 0");
WiredHome 44:207594dece70 2010 for (i=0; i<16; i++) {
WiredHome 44:207594dece70 2011 x1 = rand() % 240;
WiredHome 44:207594dece70 2012 y1 = 50 + rand() % 200;
WiredHome 44:207594dece70 2013 x2 = x1 + rand() % 100;
WiredHome 44:207594dece70 2014 y2 = y1 + rand() % 100;
WiredHome 44:207594dece70 2015 r1 = rand() % (x2 - x1)/2;
WiredHome 44:207594dece70 2016 r2 = rand() % (y2 - y1)/2;
WiredHome 44:207594dece70 2017 display.roundrect(x1,y1, x2,y2, r1,r2, display.DOSColor(i));
WiredHome 44:207594dece70 2018 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2019 wait_ms(20);
WiredHome 44:207594dece70 2020 }
WiredHome 44:207594dece70 2021 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2022 wait_ms(1000);
WiredHome 44:207594dece70 2023
WiredHome 50:2c4f474a2453 2024 display.SelectDrawingLayer(1);
WiredHome 44:207594dece70 2025 display.background(Black);
WiredHome 44:207594dece70 2026 display.foreground(Yellow);
WiredHome 44:207594dece70 2027 display.cls();
WiredHome 44:207594dece70 2028 display.puts(240,0, "Layer 1");
WiredHome 44:207594dece70 2029 for (i=0; i<16; i++) {
WiredHome 44:207594dece70 2030 x1 = 300 + rand() % 100;
WiredHome 44:207594dece70 2031 y1 = 70 + rand() % 200;
WiredHome 44:207594dece70 2032 r1 = rand() % min(y1 - 20, 100);
WiredHome 44:207594dece70 2033 display.circle(x1,y1,r1, display.DOSColor(i));
WiredHome 44:207594dece70 2034 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2035 wait_ms(20);
WiredHome 44:207594dece70 2036 }
WiredHome 56:7a85d226ad0d 2037 display.SetLayerMode(RA8875::ShowLayer1); // Show it after the build-up
WiredHome 44:207594dece70 2038 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2039 wait_ms(2000);
WiredHome 44:207594dece70 2040
WiredHome 50:2c4f474a2453 2041 display.SelectDrawingLayer(0);
WiredHome 56:7a85d226ad0d 2042 display.SetLayerMode(RA8875::ShowLayer0); // Show Layer 0 again
WiredHome 44:207594dece70 2043 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2044 wait_ms(1000);
WiredHome 53:86d24b9480b9 2045 display.SetLayerMode(RA8875::TransparentMode); // Transparent mode
WiredHome 44:207594dece70 2046 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2047 wait_ms(1000);
WiredHome 44:207594dece70 2048 for (i=0; i<=8; i++) {
WiredHome 44:207594dece70 2049 display.SetLayerTransparency(i, 8-i);
WiredHome 44:207594dece70 2050 if (!SuppressSlowStuff)
WiredHome 44:207594dece70 2051 wait_ms(200);
WiredHome 44:207594dece70 2052 }
WiredHome 73:f22a18707b5e 2053
WiredHome 44:207594dece70 2054 // Restore before we exit
WiredHome 44:207594dece70 2055 display.SetLayerTransparency(0, 0);
WiredHome 56:7a85d226ad0d 2056 display.SetLayerMode(RA8875::ShowLayer0); // Restore to layer 0
WiredHome 44:207594dece70 2057 }
WiredHome 44:207594dece70 2058
WiredHome 44:207594dece70 2059
WiredHome 23:a50ded45dbaf 2060 void RoundRectTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2061 {
WiredHome 37:f19b7e7449dc 2062 loc_t i, x1,y1, x2,y2, r1,r2;
WiredHome 23:a50ded45dbaf 2063
WiredHome 41:2956a0a221e5 2064 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2065 pc.printf("Round Rectangle Test\r\n");
WiredHome 23:a50ded45dbaf 2066 display.background(Black);
WiredHome 23:a50ded45dbaf 2067 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2068 display.cls();
WiredHome 23:a50ded45dbaf 2069 display.puts(0,0, "Rounded Rectangle Test");
WiredHome 73:f22a18707b5e 2070
WiredHome 23:a50ded45dbaf 2071 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2072 x1 = rand() % 240;
WiredHome 23:a50ded45dbaf 2073 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2074 x2 = x1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2075 y2 = y1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2076 r1 = rand() % (x2 - x1)/2;
WiredHome 23:a50ded45dbaf 2077 r2 = rand() % (y2 - y1)/2;
WiredHome 23:a50ded45dbaf 2078 display.roundrect(x1,y1, x2,y2, 5,8, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2079
WiredHome 23:a50ded45dbaf 2080 x1 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2081 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2082 x2 = x1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2083 y2 = y1 + rand() % 100;
WiredHome 23:a50ded45dbaf 2084 r1 = rand() % (x2 - x1)/2;
WiredHome 23:a50ded45dbaf 2085 r2 = rand() % (y2 - y1)/2;
WiredHome 23:a50ded45dbaf 2086 display.roundrect(x1,y1, x2,y2, r1,r2, FILL);
WiredHome 23:a50ded45dbaf 2087 }
WiredHome 23:a50ded45dbaf 2088 }
WiredHome 23:a50ded45dbaf 2089
WiredHome 44:207594dece70 2090
WiredHome 23:a50ded45dbaf 2091 void TriangleTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2092 {
WiredHome 23:a50ded45dbaf 2093 int i, x1, y1, x2, y2, x3, y3;
WiredHome 23:a50ded45dbaf 2094
WiredHome 41:2956a0a221e5 2095 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2096 pc.printf("Triangle Test\r\n");
WiredHome 23:a50ded45dbaf 2097 display.background(Black);
WiredHome 23:a50ded45dbaf 2098 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2099 display.cls();
WiredHome 23:a50ded45dbaf 2100 display.puts(0,0, "Triangle Test");
WiredHome 23:a50ded45dbaf 2101
WiredHome 23:a50ded45dbaf 2102 x1 = 150;
WiredHome 23:a50ded45dbaf 2103 y1 = 2;
WiredHome 23:a50ded45dbaf 2104 x2 = 190;
WiredHome 23:a50ded45dbaf 2105 y2 = 7;
WiredHome 23:a50ded45dbaf 2106 x3 = 170;
WiredHome 23:a50ded45dbaf 2107 y3 = 16;
WiredHome 23:a50ded45dbaf 2108 display.triangle(x1,y1, x2,y2, x3,y3);
WiredHome 23:a50ded45dbaf 2109
WiredHome 23:a50ded45dbaf 2110 x1 = 200;
WiredHome 23:a50ded45dbaf 2111 y1 = 2;
WiredHome 23:a50ded45dbaf 2112 x2 = 240;
WiredHome 23:a50ded45dbaf 2113 y2 = 7;
WiredHome 23:a50ded45dbaf 2114 x3 = 220;
WiredHome 23:a50ded45dbaf 2115 y3 = 16;
WiredHome 23:a50ded45dbaf 2116 display.filltriangle(x1,y1, x2,y2, x3,y3, BrightRed);
WiredHome 23:a50ded45dbaf 2117
WiredHome 23:a50ded45dbaf 2118 x1 = 300;
WiredHome 23:a50ded45dbaf 2119 y1 = 2;
WiredHome 23:a50ded45dbaf 2120 x2 = 340;
WiredHome 23:a50ded45dbaf 2121 y2 = 7;
WiredHome 23:a50ded45dbaf 2122 x3 = 320;
WiredHome 23:a50ded45dbaf 2123 y3 = 16;
WiredHome 23:a50ded45dbaf 2124 display.triangle(x1,y1, x2,y2, x3,y3, NOFILL);
WiredHome 23:a50ded45dbaf 2125
WiredHome 23:a50ded45dbaf 2126 x1 = 400;
WiredHome 23:a50ded45dbaf 2127 y1 = 2;
WiredHome 23:a50ded45dbaf 2128 x2 = 440;
WiredHome 23:a50ded45dbaf 2129 y2 = 7;
WiredHome 23:a50ded45dbaf 2130 x3 = 420;
WiredHome 23:a50ded45dbaf 2131 y3 = 16;
WiredHome 23:a50ded45dbaf 2132 display.triangle(x1,y1, x2,y2, x3,y3, Blue);
WiredHome 23:a50ded45dbaf 2133
WiredHome 23:a50ded45dbaf 2134 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2135 x1 = rand() % 240;
WiredHome 23:a50ded45dbaf 2136 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2137 x2 = rand() % 240;
WiredHome 23:a50ded45dbaf 2138 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2139 x3 = rand() % 240;
WiredHome 23:a50ded45dbaf 2140 y3 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2141 display.triangle(x1,y1, x2,y2, x3,y3, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2142 x1 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2143 y1 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2144 x2 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2145 y2 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2146 x3 = 240 + rand() % 240;
WiredHome 23:a50ded45dbaf 2147 y3 = 50 + rand() % 200;
WiredHome 23:a50ded45dbaf 2148 display.triangle(x1,y1, x2,y2, x3,y3, FILL);
WiredHome 23:a50ded45dbaf 2149 }
WiredHome 23:a50ded45dbaf 2150 }
WiredHome 23:a50ded45dbaf 2151
WiredHome 44:207594dece70 2152
WiredHome 23:a50ded45dbaf 2153 void CircleTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2154 {
WiredHome 23:a50ded45dbaf 2155 int i, x, y, r1;
WiredHome 23:a50ded45dbaf 2156
WiredHome 41:2956a0a221e5 2157 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2158 pc.printf("Circle Test\r\n");
WiredHome 23:a50ded45dbaf 2159 display.background(Black);
WiredHome 23:a50ded45dbaf 2160 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2161 display.cls();
WiredHome 23:a50ded45dbaf 2162 display.puts(0,0, "Circle Test");
WiredHome 23:a50ded45dbaf 2163 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2164 x = 100 + rand() % 100;
WiredHome 23:a50ded45dbaf 2165 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2166 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2167 //pc.printf(" (%d,%d) - %d\r\n", x,y,r1);
WiredHome 23:a50ded45dbaf 2168 display.circle(x,y,r1, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2169
WiredHome 23:a50ded45dbaf 2170 x = 300 + rand() % 100;
WiredHome 23:a50ded45dbaf 2171 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2172 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2173 //pc.printf(" (%d,%d) - %d FILL\r\n", x,y,r1);
WiredHome 23:a50ded45dbaf 2174 display.circle(x,y,r1, display.DOSColor(i), FILL);
WiredHome 23:a50ded45dbaf 2175 }
WiredHome 23:a50ded45dbaf 2176 }
WiredHome 23:a50ded45dbaf 2177
WiredHome 44:207594dece70 2178
WiredHome 23:a50ded45dbaf 2179 void EllipseTest(RA8875 & display, Serial & pc)
WiredHome 23:a50ded45dbaf 2180 {
WiredHome 23:a50ded45dbaf 2181 int i,x,y,r1,r2;
WiredHome 23:a50ded45dbaf 2182
WiredHome 41:2956a0a221e5 2183 if (!SuppressSlowStuff)
WiredHome 41:2956a0a221e5 2184 pc.printf("Ellipse Test\r\n");
WiredHome 23:a50ded45dbaf 2185 display.background(Black);
WiredHome 23:a50ded45dbaf 2186 display.foreground(Blue);
WiredHome 23:a50ded45dbaf 2187 display.cls();
WiredHome 23:a50ded45dbaf 2188 display.puts(0,0, "Ellipse Test");
WiredHome 23:a50ded45dbaf 2189 for (i=0; i<16; i++) {
WiredHome 23:a50ded45dbaf 2190 x = 100 + rand() % 100;
WiredHome 23:a50ded45dbaf 2191 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2192 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2193 r2 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2194 display.ellipse(x,y,r1,r2, display.DOSColor(i));
WiredHome 23:a50ded45dbaf 2195
WiredHome 23:a50ded45dbaf 2196 x = 300 + rand() % 100;
WiredHome 23:a50ded45dbaf 2197 y = 70 + rand() % 200;
WiredHome 23:a50ded45dbaf 2198 r1 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2199 r2 = rand() % min(y - 20, 100);
WiredHome 23:a50ded45dbaf 2200 display.ellipse(x,y,r1,r2, FILL);
WiredHome 23:a50ded45dbaf 2201 }
WiredHome 23:a50ded45dbaf 2202 }
WiredHome 23:a50ded45dbaf 2203
WiredHome 44:207594dece70 2204
WiredHome 37:f19b7e7449dc 2205 void TestGraphicsBitmap(RA8875 & display, Serial & pc)
WiredHome 37:f19b7e7449dc 2206 {
WiredHome 37:f19b7e7449dc 2207 LocalFileSystem local("local");
WiredHome 41:2956a0a221e5 2208 if (!SuppressSlowStuff)
WiredHome 73:f22a18707b5e 2209 pc.printf("Bitmap File Load\r\n");
WiredHome 37:f19b7e7449dc 2210 display.background(Black);
WiredHome 37:f19b7e7449dc 2211 display.foreground(Blue);
WiredHome 37:f19b7e7449dc 2212 display.cls();
WiredHome 37:f19b7e7449dc 2213 display.puts(0,0, "Graphics Test, loading /local/TestPat.bmp");
WiredHome 37:f19b7e7449dc 2214 wait(3);
WiredHome 37:f19b7e7449dc 2215
WiredHome 37:f19b7e7449dc 2216 int r = display.RenderBitmapFile(0,0, "/local/TestPat.bmp");
WiredHome 59:fb40aad4efd4 2217 if (!SuppressSlowStuff)
WiredHome 59:fb40aad4efd4 2218 pc.printf(" returned %d\r\n", r);
WiredHome 37:f19b7e7449dc 2219 }
WiredHome 37:f19b7e7449dc 2220
WiredHome 44:207594dece70 2221
WiredHome 77:9206c13aa527 2222 void TouchPanelTest(RA8875 & display, Serial & pc)
WiredHome 77:9206c13aa527 2223 {
WiredHome 77:9206c13aa527 2224 Timer t;
WiredHome 77:9206c13aa527 2225 loc_t x, y;
WiredHome 78:faf49c381591 2226 tpMatrix_t calmatrix;
WiredHome 78:faf49c381591 2227
WiredHome 77:9206c13aa527 2228 display.background(Black);
WiredHome 77:9206c13aa527 2229 display.foreground(Blue);
WiredHome 77:9206c13aa527 2230 display.cls();
WiredHome 77:9206c13aa527 2231 display.puts(0,0, "Touch Panel Test\r\n");
WiredHome 78:faf49c381591 2232 pc.printf("Touch Panel Test\r\n");
WiredHome 77:9206c13aa527 2233 display.TouchPanelInit();
WiredHome 78:faf49c381591 2234 pc.printf(" TP: c - calibrate, r - restore, t - test\r\n");
WiredHome 78:faf49c381591 2235 int c = pc.getc();
WiredHome 78:faf49c381591 2236 if (c == 'c') {
WiredHome 78:faf49c381591 2237 point_t pTest[3] =
WiredHome 78:faf49c381591 2238 { { 50, 50 }, {450, 150}, {225,250} };
WiredHome 78:faf49c381591 2239 point_t pSample[3];
WiredHome 78:faf49c381591 2240 for (int i=0; i<3; i++) {
WiredHome 78:faf49c381591 2241 display.foreground(Blue);
WiredHome 78:faf49c381591 2242 display.printf(" (%3d,%3d) => ", pTest[i].x, pTest[i].y);
WiredHome 78:faf49c381591 2243 display.line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, White);
WiredHome 78:faf49c381591 2244 display.line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, White);
WiredHome 79:544eb4964795 2245 while (!display.TouchPanelA2DFiltered(&x, &y))
WiredHome 78:faf49c381591 2246 wait_ms(20);
WiredHome 78:faf49c381591 2247 pSample[i].x = x;
WiredHome 78:faf49c381591 2248 pSample[i].y = y;
WiredHome 78:faf49c381591 2249 display.line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, Black);
WiredHome 78:faf49c381591 2250 display.line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, Black);
WiredHome 78:faf49c381591 2251 display.foreground(Blue);
WiredHome 78:faf49c381591 2252 display.printf(" (%4d,%4d)\r\n", x,y);
WiredHome 79:544eb4964795 2253 while (display.TouchPanelA2DFiltered(&x, &y))
WiredHome 78:faf49c381591 2254 wait_ms(20);
WiredHome 78:faf49c381591 2255 wait(2);
WiredHome 78:faf49c381591 2256 }
WiredHome 78:faf49c381591 2257 display.TouchPanelCalibrate(pTest, pSample, &calmatrix);
WiredHome 78:faf49c381591 2258 display.printf(" Writing calibration to tpcal.cfg\r\n");
WiredHome 78:faf49c381591 2259 FILE * fh = fopen("/local/tpcal.cfg", "wb");
WiredHome 78:faf49c381591 2260 if (fh) {
WiredHome 78:faf49c381591 2261 fwrite(&calmatrix, sizeof(calmatrix), 1, fh);
WiredHome 78:faf49c381591 2262 fclose(fh);
WiredHome 78:faf49c381591 2263 }
WiredHome 78:faf49c381591 2264 display.printf(" Calibration is complete.");
WiredHome 78:faf49c381591 2265 } else if (c == 'r') {
WiredHome 78:faf49c381591 2266 display.printf(" Reading calibration from tpcal.cfg\r\n");
WiredHome 78:faf49c381591 2267 FILE * fh = fopen("/local/tpcal.cfg", "rb");
WiredHome 78:faf49c381591 2268 if (fh) {
WiredHome 78:faf49c381591 2269 fread(&calmatrix, sizeof(calmatrix), 1, fh);
WiredHome 78:faf49c381591 2270 fclose(fh);
WiredHome 78:faf49c381591 2271 }
WiredHome 78:faf49c381591 2272 display.printf(" Calibration is complete.");
WiredHome 78:faf49c381591 2273 display.TouchPanelSetMatrix(&calmatrix);
WiredHome 77:9206c13aa527 2274 }
WiredHome 77:9206c13aa527 2275 t.start();
WiredHome 77:9206c13aa527 2276 do {
WiredHome 77:9206c13aa527 2277 point_t point = {0, 0};
WiredHome 79:544eb4964795 2278 if (display.TouchPanelReadable(&point)) {
WiredHome 77:9206c13aa527 2279 display.pixel(point.x, point.y, Red);
WiredHome 77:9206c13aa527 2280 }
WiredHome 77:9206c13aa527 2281 } while (t.read_ms() < 30000);
WiredHome 77:9206c13aa527 2282 pc.printf(">");
WiredHome 77:9206c13aa527 2283 }
WiredHome 77:9206c13aa527 2284
WiredHome 77:9206c13aa527 2285
WiredHome 41:2956a0a221e5 2286 void SpeedTest(RA8875 & display, Serial & pc)
WiredHome 41:2956a0a221e5 2287 {
WiredHome 41:2956a0a221e5 2288 Timer t;
WiredHome 41:2956a0a221e5 2289 SuppressSlowStuff = true;
WiredHome 41:2956a0a221e5 2290 pc.printf("\r\nSpeedTest disables delays, runs tests, reports overall time.\r\n");
WiredHome 41:2956a0a221e5 2291 t.start();
WiredHome 41:2956a0a221e5 2292 // do stuff fast
WiredHome 41:2956a0a221e5 2293 TextCursorTest(display, pc);
WiredHome 49:c5182231d1b9 2294 TextWrapTest(display, pc);
WiredHome 41:2956a0a221e5 2295 BacklightTest(display, pc, 0);
WiredHome 41:2956a0a221e5 2296 BacklightTest2(display, pc);
WiredHome 41:2956a0a221e5 2297 ExternalFontTest(display, pc);
WiredHome 41:2956a0a221e5 2298 DOSColorTest(display, pc);
WiredHome 41:2956a0a221e5 2299 WebColorTest(display, pc);
WiredHome 41:2956a0a221e5 2300 PixelTest(display, pc);
WiredHome 41:2956a0a221e5 2301 LineTest(display, pc);
WiredHome 41:2956a0a221e5 2302 RectangleTest(display, pc);
WiredHome 41:2956a0a221e5 2303 RoundRectTest(display, pc);
WiredHome 41:2956a0a221e5 2304 TriangleTest(display, pc);
WiredHome 41:2956a0a221e5 2305 CircleTest(display, pc);
WiredHome 41:2956a0a221e5 2306 EllipseTest(display, pc);
WiredHome 44:207594dece70 2307 LayerTest(display, pc);
WiredHome 41:2956a0a221e5 2308 //TestGraphicsBitmap(display, pc);
WiredHome 41:2956a0a221e5 2309 pc.printf("SpeedTest completed in %d msec\r\n", t.read_ms());
WiredHome 73:f22a18707b5e 2310 #ifdef PERF_METRICS
WiredHome 41:2956a0a221e5 2311 display.ReportPerformance(pc);
WiredHome 73:f22a18707b5e 2312 #endif
WiredHome 41:2956a0a221e5 2313 SuppressSlowStuff = false;
WiredHome 41:2956a0a221e5 2314 }
WiredHome 41:2956a0a221e5 2315
WiredHome 44:207594dece70 2316
WiredHome 41:2956a0a221e5 2317 void PrintScreen(RA8875 & display, Serial & pc)
WiredHome 41:2956a0a221e5 2318 {
WiredHome 41:2956a0a221e5 2319 if (!SuppressSlowStuff)
WiredHome 73:f22a18707b5e 2320 pc.printf("PrintScreen\r\n");
WiredHome 41:2956a0a221e5 2321 display.PrintScreen( 0,0, 480,272, "/local/Capture.bmp");
WiredHome 41:2956a0a221e5 2322 }
WiredHome 41:2956a0a221e5 2323
WiredHome 44:207594dece70 2324
WiredHome 23:a50ded45dbaf 2325 void RunTestSet(RA8875 & lcd, Serial & pc)
WiredHome 23:a50ded45dbaf 2326 {
WiredHome 23:a50ded45dbaf 2327 int q = 0;
WiredHome 23:a50ded45dbaf 2328 int automode = 0;
WiredHome 49:c5182231d1b9 2329 const unsigned char modelist[] = "BDWtGLlFROTPCEbw"; // auto-test in this order.
WiredHome 23:a50ded45dbaf 2330
WiredHome 23:a50ded45dbaf 2331 while(1) {
WiredHome 23:a50ded45dbaf 2332 pc.printf("\r\n"
WiredHome 41:2956a0a221e5 2333 "B - Backlight up b - backlight dim\r\n"
WiredHome 41:2956a0a221e5 2334 "D - DOS Colors W - Web Colors\r\n"
WiredHome 41:2956a0a221e5 2335 "t - text cursor G - Graphics Bitmap\r\n"
WiredHome 41:2956a0a221e5 2336 "L - Lines F - external Font\r\n"
WiredHome 41:2956a0a221e5 2337 "R - Rectangles O - rOund rectangles\r\n"
WiredHome 41:2956a0a221e5 2338 "T - Triangles P - Pixels \r\n"
WiredHome 41:2956a0a221e5 2339 "C - Circles E - Ellipses\r\n"
WiredHome 41:2956a0a221e5 2340 "A - Auto Test mode S - Speed Test\r\n"
WiredHome 77:9206c13aa527 2341 "K - Keypad Test s - touch screen test\r\n"
WiredHome 41:2956a0a221e5 2342 "p - print screen r - reset \r\n"
WiredHome 49:c5182231d1b9 2343 "l - layer test w - wrapping text \r\n"
WiredHome 73:f22a18707b5e 2344 #ifdef PERF_METRICS
WiredHome 41:2956a0a221e5 2345 "0 - clear performance 1 - report performance\r\n"
WiredHome 73:f22a18707b5e 2346 #endif
WiredHome 23:a50ded45dbaf 2347 "> ");
WiredHome 23:a50ded45dbaf 2348 if (automode == -1 || pc.readable()) {
WiredHome 23:a50ded45dbaf 2349 automode = -1;
WiredHome 37:f19b7e7449dc 2350 q = pc.getc();
WiredHome 37:f19b7e7449dc 2351 while (pc.readable())
WiredHome 37:f19b7e7449dc 2352 pc.getc();
WiredHome 23:a50ded45dbaf 2353 } else if (automode >= 0) {
WiredHome 23:a50ded45dbaf 2354 q = modelist[automode];
WiredHome 23:a50ded45dbaf 2355 }
WiredHome 23:a50ded45dbaf 2356 switch(q) {
WiredHome 73:f22a18707b5e 2357 #ifdef PERF_METRICS
WiredHome 41:2956a0a221e5 2358 case '0':
WiredHome 41:2956a0a221e5 2359 lcd.ClearPerformance();
WiredHome 41:2956a0a221e5 2360 break;
WiredHome 41:2956a0a221e5 2361 case '1':
WiredHome 41:2956a0a221e5 2362 lcd.ReportPerformance(pc);
WiredHome 41:2956a0a221e5 2363 break;
WiredHome 73:f22a18707b5e 2364 #endif
WiredHome 23:a50ded45dbaf 2365 case 'A':
WiredHome 23:a50ded45dbaf 2366 automode = 0;
WiredHome 23:a50ded45dbaf 2367 break;
WiredHome 23:a50ded45dbaf 2368 case 'B':
WiredHome 41:2956a0a221e5 2369 BacklightTest(lcd, pc, 2);
WiredHome 23:a50ded45dbaf 2370 break;
WiredHome 23:a50ded45dbaf 2371 case 'b':
WiredHome 23:a50ded45dbaf 2372 BacklightTest2(lcd, pc);
WiredHome 23:a50ded45dbaf 2373 break;
WiredHome 23:a50ded45dbaf 2374 case 'D':
WiredHome 23:a50ded45dbaf 2375 DOSColorTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2376 break;
WiredHome 75:ca78388cfd77 2377 case 'K':
WiredHome 75:ca78388cfd77 2378 KeyPadTest(lcd, pc);
WiredHome 75:ca78388cfd77 2379 break;
WiredHome 23:a50ded45dbaf 2380 case 'W':
WiredHome 23:a50ded45dbaf 2381 WebColorTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2382 break;
WiredHome 23:a50ded45dbaf 2383 case 't':
WiredHome 23:a50ded45dbaf 2384 TextCursorTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2385 break;
WiredHome 49:c5182231d1b9 2386 case 'w':
WiredHome 49:c5182231d1b9 2387 TextWrapTest(lcd, pc);
WiredHome 49:c5182231d1b9 2388 break;
WiredHome 23:a50ded45dbaf 2389 case 'F':
WiredHome 23:a50ded45dbaf 2390 ExternalFontTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2391 break;
WiredHome 23:a50ded45dbaf 2392 case 'L':
WiredHome 23:a50ded45dbaf 2393 LineTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2394 break;
WiredHome 44:207594dece70 2395 case 'l':
WiredHome 44:207594dece70 2396 LayerTest(lcd, pc);
WiredHome 44:207594dece70 2397 break;
WiredHome 23:a50ded45dbaf 2398 case 'R':
WiredHome 23:a50ded45dbaf 2399 RectangleTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2400 break;
WiredHome 23:a50ded45dbaf 2401 case 'O':
WiredHome 23:a50ded45dbaf 2402 RoundRectTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2403 break;
WiredHome 41:2956a0a221e5 2404 case 'p':
WiredHome 41:2956a0a221e5 2405 PrintScreen(lcd, pc);
WiredHome 41:2956a0a221e5 2406 break;
WiredHome 41:2956a0a221e5 2407 case 'S':
WiredHome 41:2956a0a221e5 2408 SpeedTest(lcd, pc);
WiredHome 41:2956a0a221e5 2409 break;
WiredHome 77:9206c13aa527 2410 case 's':
WiredHome 77:9206c13aa527 2411 TouchPanelTest(lcd, pc);
WiredHome 77:9206c13aa527 2412 break;
WiredHome 23:a50ded45dbaf 2413 case 'T':
WiredHome 23:a50ded45dbaf 2414 TriangleTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2415 break;
WiredHome 37:f19b7e7449dc 2416 case 'P':
WiredHome 37:f19b7e7449dc 2417 PixelTest(lcd, pc);
WiredHome 37:f19b7e7449dc 2418 break;
WiredHome 37:f19b7e7449dc 2419 case 'G':
WiredHome 37:f19b7e7449dc 2420 TestGraphicsBitmap(lcd, pc);
WiredHome 37:f19b7e7449dc 2421 break;
WiredHome 23:a50ded45dbaf 2422 case 'C':
WiredHome 23:a50ded45dbaf 2423 CircleTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2424 break;
WiredHome 23:a50ded45dbaf 2425 case 'E':
WiredHome 23:a50ded45dbaf 2426 EllipseTest(lcd, pc);
WiredHome 23:a50ded45dbaf 2427 break;
WiredHome 23:a50ded45dbaf 2428 case 'r':
WiredHome 23:a50ded45dbaf 2429 pc.printf("Resetting ...\r\n");
WiredHome 23:a50ded45dbaf 2430 wait_ms(20);
WiredHome 23:a50ded45dbaf 2431 mbed_reset();
WiredHome 23:a50ded45dbaf 2432 break;
WiredHome 75:ca78388cfd77 2433 case ' ':
WiredHome 75:ca78388cfd77 2434 break;
WiredHome 23:a50ded45dbaf 2435 default:
WiredHome 23:a50ded45dbaf 2436 printf("huh?\n");
WiredHome 23:a50ded45dbaf 2437 break;
WiredHome 23:a50ded45dbaf 2438 }
WiredHome 23:a50ded45dbaf 2439 if (automode >= 0) {
WiredHome 23:a50ded45dbaf 2440 automode++;
WiredHome 23:a50ded45dbaf 2441 if (automode >= sizeof(modelist))
WiredHome 23:a50ded45dbaf 2442 automode = 0;
WiredHome 23:a50ded45dbaf 2443 wait_ms(2000);
WiredHome 23:a50ded45dbaf 2444 }
WiredHome 23:a50ded45dbaf 2445 wait_ms(200);
WiredHome 23:a50ded45dbaf 2446 }
WiredHome 23:a50ded45dbaf 2447 }
WiredHome 23:a50ded45dbaf 2448
WiredHome 79:544eb4964795 2449 #endif // TESTENABLE